定义:
中介者模式:定义一个对象来封装一系列对象的交互。中介者模式使各对象之间不需要显示的相互引用,从而使其耦合松散,而且用户可以独立地改变它们之间的交互。
中介者模式可以将系统的网状结构变成以中介者为中心的星行结构。
中介者模式是迪米特法则的一个典型应用。
中介者模式包含一些4个角色:
//抽象中介者
/**
* 抽象中介者
*/
public abstract class Mediator {
public abstract void componentChanged(Component c);
}
//具体中介者
/**
* 组件的具体中介者
*/
public class ComponentMediator extends Mediator{
private ButtonComponent button;
private ListComponent list;
private ComboBoxComponent comboBox;
private TextBoxComponent textBox;
@Override
public void componentChanged(Component c) {
if(c == button){
System.out.println("---单击增加按钮---");
list.update();
comboBox.update();
textBox.update();
}else if (c == list){
System.out.println("---从列表框选择客户---");
comboBox.select();
textBox.setText();
}else if(c == comboBox){
System.out.println("---从组合框选择客户---");
comboBox.select();
textBox.setText();
}
}
public void setButton(ButtonComponent button) {
this.button = button;
}
public void setList(ListComponent list) {
this.list = list;
}
public void setComboBox(ComboBoxComponent comboBox) {
this.comboBox = comboBox;
}
public void setTextBox(TextBoxComponent textBox) {
this.textBox = textBox;
}
}
//抽象同事类
/**
* 抽象组件类
*/
public abstract class Component {
private Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void changed(){
mediator.componentChanged(this);
};
public abstract void update();
}
//具体同事类
/**
* 按钮类,具体同事类
*/
public class ButtonComponent extends Component{
@Override
public void update() {
//按钮不产生响应
}
}
/**
* 列表框类,具体同事类
*/
public class ListComponent extends Component{
@Override
public void update() {
System.out.println("列表框增加一项:关羽");
}
public void select(){
System.out.println("列表框选中一项:张飞");
}
}
/**
* 组合框,具体同事类
*/
public class ComboBoxComponent extends Component{
@Override
public void update() {
System.out.println("组合框增加一项:赵云");
}
public void select(){
System.out.println("组合框选中项:刘备");
}
}
/**
* 文本框类,具体同事类
*/
public class TextBoxComponent extends Component{
@Override
public void update() {
System.out.println("客户信息增加成功后文本框清空。");
}
public void setText(){
System.out.println("文本框显示:诸葛亮");
}
}
//客户端
public class Client {
public static void main(String[] args) {
/**
* 案例需求描述:
* 一个客户信息管理模块,在界面组件之间存在较为复杂的交互关系:
* 如果删除一个客户,则将从客户列表List中删掉对应的项,客户选择组合框中的客户名称也将对应的减少一个;
* 如果增加一个客户,则将从客户列表List中增加一个客户,并且组合框中也将增加一项。
* 请使用中介者模式模拟该功能模块。
*/
//定义终结者对象
ComponentMediator mediator;
mediator = new ComponentMediator();
//定义同事对象
ButtonComponent button = new ButtonComponent();
ListComponent list = new ListComponent();
ComboBoxComponent comboBox = new ComboBoxComponent();
TextBoxComponent textBox = new TextBoxComponent();
button.setMediator(mediator);
list.setMediator(mediator);
comboBox.setMediator(mediator);
textBox.setMediator(mediator);
mediator.setButton(button);
mediator.setList(list);
mediator.setComboBox(comboBox);
mediator.setTextBox(textBox);
//动作
button.changed();
System.out.println("-----------");
list.changed();
System.out.println("-----------");
comboBox.changed();
}
}
【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。
【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git