核心
- 如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系极其复杂,这些对象称为"同事对象"。
-
我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为星形结构。
中介者模式
package mediator;
// 中介类接口
public interface Mediator {
void register(String dname,Department d);
void command(String dname);
}
package mediator;
// 同事类接口
public interface Department {
void selfAction(); // 做本部门的事情
void outAction(); // 向经理发出申请
}
package mediator;
public class Finacial implements Department{
private Mediator mediator; // 持有中介者(经理)的引用
public Finacial(Mediator mediator) {
this.mediator = mediator;
mediator.register("Finacial",this);
}
public void selfAction() {
System.out.println("财务部:专心数钱,打钱");
}
public void outAction() {
System.out.println("财务部:汇报工作,买买买");
}
}
package mediator;
public class Market implements Department{
private Mediator mediator; // 持有中介者(经理)的引用
public Market(Mediator mediator) {
this.mediator = mediator;
mediator.register("Market",this);
}
public void selfAction() {
System.out.println("市场部:专心跑业务");
}
public void outAction() {
System.out.println("市场部:汇报工作,申请资金");
mediator.command("Finacial");
}
}
package mediator;
import java.util.HashMap;
import java.util.Map;
// 经理类
public class President implements Mediator{
private Map<String,Department> map = new HashMap<String, Department>();
public void register(String dname, Department d) {
map.put(dname,d);
}
public void command(String dname) {
map.get(dname).selfAction();
}
}
package mediator;
public class Client {
public static void main(String[] args) {
Mediator mediator = new President();
Market market = new Market(mediator);
Development development = new Development(mediator);
Finacial finacial = new Finacial(mediator);
market.selfAction();
market.outAction();
}
}
输出:
市场部:专心跑业务
市场部:汇报工作,申请资金
财务部:专心数钱,打钱
中介者模式的本质
解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
开发中常见的场景
- MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交道)
- 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
- 图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象。
- Java.lang.reflect.Method#invoke()
优缺点
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂时的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
优点
- Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator
- 由于把对象如何协作进行了抽象,将中介作为一个独立地概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统
缺点
- 由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
网友评论