本文来自廖雪峰,郎涯进行简单排版与补充
中介模式,即Mediator是通过引入一个中介对象,把多边关系变成多个双边关系,从而简化系统组件的交互耦合度。
考虑一个简单的点餐输入:
这个小系统有4个参与对象:
- 多选框;
- “选择全部”按钮;
- “取消所有”按钮;
- “反选”按钮。
它的复杂性在于,当多选框变化时,它会影响“选择全部”和“取消所有”按钮的状态(是否可点击),当用户点击某个按钮时,例如“反选”,除了会影响多选框的状态,它又可能影响“选择全部”和“取消所有”按钮的状态。
所以这是一个多方会谈,逻辑写起来很复杂:
┌─────────────────┐ ┌─────────────────┐
│ CheckBox List │<───>│SelectAll Button │
└─────────────────┘ └─────────────────┘
▲ ▲ ▲
│ └─────────────────────┤
▼ │
┌─────────────────┐ ┌────────┴────────┐
│SelectNone Button│<────│ Inverse Button │
└─────────────────┘ └─────────────────┘
如果我们引入一个中介,把多方会谈变成多个双方会谈,虽然多了一个对象,但对象之间的关系就变简单了:
┌─────────────────┐
┌─────>│ CheckBox List │
│ └─────────────────┘
│ ┌─────────────────┐
│ ┌───>│SelectAll Button │
▼ ▼ └─────────────────┘
┌─────────┐
│Mediator │
└─────────┘
▲ ▲ ┌─────────────────┐
│ └───>│SelectNone Button│
│ └─────────────────┘
│ ┌─────────────────┐
└─────>│ Inverse Button │
└─────────────────┘
使用Mediator模式后,我们得到了以下好处:
- 各个UI组件互不引用,这样就减少了组件之间的耦合关系;
- Mediator用于当一个组件发生状态变化时,根据当前所有组件的状态决定更新某些组件;
- 如果新增一个UI组件,我们只需要修改Mediator更新状态的逻辑,现有的其他UI组件代码不变。