中介者模式(Mediator Pattern)是一种行为型设计模式,旨在通过引入一个中介对象来封装多个对象的交互。它的主要作用是减少各个对象之间的直接引用,从而降低系统的耦合度,并使得对象间的交互变得更加灵活和简洁。
1. 什么是中介者模式?
中介者模式的核心思想是通过一个中介者对象来协调各个组件之间的交互。这样,组件不再直接依赖其他组件,而是通过中介者进行信息传递和操作,从而简化了对象之间的关系。这种模式特别适用于那些存在复杂交互的系统,可以避免多方的直接沟通,降低系统的复杂度。
简单来说,中介者模式是把多个单一交互的关系转变为双向的交互,通过中介者统一处理所有的交互逻辑,使得系统更加易于维护和扩展。
2. 中介者模式的结构
中介者模式的结构包括以下几个主要角色:
-
Mediator(中介者):定义一个接口,负责各个同事对象(组件)之间的协调与管理。中介者会监听所有组件的变化,并根据需要更新相关组件的状态。
-
ConcreteMediator(具体中介者):实现Mediator接口,管理和协调各个具体组件之间的交互。它保持对各个同事对象的引用,并在发生变化时通知它们。
-
Colleague(同事对象):各个参与交互的组件,它们通过中介者与其他组件进行通信,而不直接依赖彼此。
3. 中介者模式的应用
3.1 示例:UI组件的交互
考虑一个简单的点餐系统,其中有多个UI组件,它们之间需要协调工作,例如复选框和按钮之间的交互。假设我们有以下几个UI组件:
-
复选框(CheckBox List)
-
选择全部按钮(Select All Button)
-
取消选择按钮(Select None Button)
-
反选按钮(Inverse Button)
如果直接通过组件间的交互来更新状态,代码会变得非常复杂。通过引入中介者模式,我们可以将这些组件的交互逻辑委托给一个中介对象,使得各个组件之间的耦合度大大降低。
3.2 代码实现
我们通过Java Swing来实现该例子。首先,创建一个简单的窗口,包含复选框和按钮:
java
public class Main {
public static void main(String[] args) {
new OrderFrame("Burger", "Nugget", "Chip", "Coffee");
}
}
class OrderFrame extends JFrame {
public OrderFrame(String... names) {
setTitle("Order");
setSize(460, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEADING, 20, 20));
c.add(new JLabel("Use Mediator Pattern"));
List<JCheckBox> checkboxList = addCheckBox(names);
JButton selectAll = addButton("Select All");
JButton selectNone = addButton("Select None");
selectNone.setEnabled(false);
JButton selectInverse = addButton("Inverse Select");
new Mediator(checkboxList, selectAll, selectNone, selectInverse);
setVisible(true);
}
private List<JCheckBox> addCheckBox(String... names) {
JPanel panel = new JPanel();
panel.add(new JLabel("Menu:"));
List<JCheckBox> list = new ArrayList<>();
for (String name : names) {
JCheckBox checkbox = new JCheckBox(name);
list.add(checkbox);
panel.add(checkbox);
}
getContentPane().add(panel);
return list;
}
private JButton addButton(String label) {
JButton button = new JButton(label);
getContentPane().add(button);
return button;
}
}
接下来,我们设计中介者(Mediator)类,用于管理各个UI组件之间的交互逻辑:
java
public class Mediator {
private List<JCheckBox> checkBoxList;
private JButton selectAll;
private JButton selectNone;
private JButton selectInverse;
public Mediator(List<JCheckBox> checkBoxList, JButton selectAll, JButton selectNone, JButton selectInverse) {
this.checkBoxList = checkBoxList;
this.selectAll = selectAll;
this.selectNone = selectNone;
this.selectInverse = selectInverse;
// 绑定事件
this.checkBoxList.forEach(checkBox -> checkBox.addChangeListener(this::onCheckBoxChanged));
this.selectAll.addActionListener(this::onSelectAllClicked);
this.selectNone.addActionListener(this::onSelectNoneClicked);
this.selectInverse.addActionListener(this::onSelectInverseClicked);
}
// 处理复选框状态变化
public void onCheckBoxChanged(ChangeEvent event) {
boolean allChecked = true;
boolean allUnchecked = true;
for (var checkBox : checkBoxList) {
if (checkBox.isSelected()) {
allUnchecked = false;
} else {
allChecked = false;
}
}
selectAll.setEnabled(!allChecked);
selectNone.setEnabled(!allUnchecked);
}
// 处理“选择全部”按钮点击
public void onSelectAllClicked(ActionEvent event) {
checkBoxList.forEach(checkBox -> checkBox.setSelected(true));
selectAll.setEnabled(false);
selectNone.setEnabled(true);
}
// 处理“选择无”按钮点击
public void onSelectNoneClicked(ActionEvent event) {
checkBoxList.forEach(checkBox -> checkBox.setSelected(false));
selectAll.setEnabled(true);
selectNone.setEnabled(false);
}
// 处理“反选”按钮点击
public void onSelectInverseClicked(ActionEvent event) {
checkBoxList.forEach(checkBox -> checkBox.setSelected(!checkBox.isSelected()));
onCheckBoxChanged(null);
}
}
3.3 运行效果
当你运行上述代码时,复选框与按钮之间的交互变得更加简单和灵活。各个组件不再直接互相引用,而是通过中介者对象来协调它们的行为。当用户操作复选框或按钮时,中介者会根据当前的状态更新其他相关组件的状态,从而实现组件之间的协调。
4. 中介者模式的优势与应用场景
4.1 优势
-
降低耦合度:通过中介者对象,各个组件不再直接依赖其他组件,从而减少了它们之间的耦合度。这使得系统的扩展和维护更加简便。
-
集中管理交互逻辑:中介者集中管理了多个组件之间的交互逻辑,避免了复杂的组件间交互关系。
-
易于扩展:当需要新增UI组件时,只需在中介者中处理相关逻辑,而不需要修改其他已有组件的代码。
4.2 应用场景
-
复杂UI交互:中介者模式常用于处理复杂的UI组件交互,尤其是在按钮、文本框、复选框等多个组件之间需要相互协作时。
-
松耦合设计:当多个组件之间存在复杂的依赖关系时,可以使用中介者模式来减少它们之间的直接引用。
-
MVC和MVVM模式:中介者模式在MVC和MVVM设计模式中也得到了广泛的应用,它们都可以看作是中介者模式的变种或扩展。
5. 小结
中介者模式通过引入一个中介者对象,将多个对象之间的复杂交互关系转化为多个简单的双向交互。它不仅简化了对象间的依赖关系,还提高了系统的灵活性和可扩展性。中介者模式特别适合用于管理复杂UI组件之间的交互,是降低耦合度和简化系统设计的有效方法。
练习:
-
尝试实现一个中介者模式,管理多个UI组件的交互。
-
在现有的UI组件中增加新的组件,观察如何通过中介者来更新交互逻辑。