中介者模式(Mediator Pattern):
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。(Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly and it lets you vary their interaction independently.)
中介者模式的本质:解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。
应用思路:如果一个系统中,对象之间的联系呈网状结构,对象之间存在大量的多对多关系,导致关系很复杂。这是可以引入一个中介者对象,各个同事对象只跟中介者对象打交道,将复杂的网络结构化解成为如下的星型结构:
开发中常见的场景:
案例:
比如说,一个公司有三个部门:财务部、市场部、研发部。那么总经理就扮演中介者的角色。用代码实现大致有以下5个步骤:
步骤1:定义抽象中介者,定义了同事对象到中介者对象的接口。
/**
* 中介者接口
*/
public interface Mediator {
void register(String dname, Department d);
void command(String dname);
}
步骤2:定义具体中介者对象,实现抽象中介者类的方法,他需要知道所有具体同事类,并从具体同事接收消息,向具体同事发出命令。
/**
* 总经理实现中介者接口
*/
public class President implements Mediator {
private Map<String,Department> map = new HashMap<String , Department>();
@Override
public void command(String dname) {
map.get(dname).selfAction();
}
@Override
public void register(String dname, Department d) {
map.put(dname, d);
}
}
步骤3:定义抽象同事类
/**
* 部门接口:同事类
*/
public interface Department {
void selfAction(); //做本部门的事情
void outAction(); //向总经理发出申请
}
步骤4:定义具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象。
/**
* 研发部
*/
public class Development implements Department {
private Mediator mediator; //持有中介者(总经理)的引用
public Development(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("development", this);
}
@Override
public void outAction() {
System.out.println("研发部向总经理发出申请:汇报工作!没钱了,需要资金支持!");
}
@Override
public void selfAction() {
System.out.println("研发部:专心科研,开发项目!");
}
}
/**
* 财务部
*/
public class Finacial implements Department {
private Mediator mediator; //持有中介者(总经理)的引用
public Finacial(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("finacial", this);
}
@Override
public void outAction() {
System.out.println("财务部向总经理发出申请:汇报工作!没钱了,钱太多了!怎么花?");
}
@Override
public void selfAction() {
System.out.println("财务部:数钱!");
}
}
/**
* 市场部
*/
public class Market implements Department {
private Mediator mediator; //持有中介者(总经理)的引用
public Market(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register("market", this);
}
@Override
public void outAction() {
System.out.println("市场部向总经理发出申请:汇报工作!项目承接的进度,需要资金支持!");
mediator.command("finacial");
}
@Override
public void selfAction() {
System.out.println("市场部:跑去接项目!");
}
}
步骤5:测试
/**
* 测试
*/
public class Client {
public static void main(String[] args) {
Mediator m = new President();
Market market = new Market(m);
Development devp = new Development(m);
Finacial f = new Finacial(m);
market.selfAction();
market.outAction();
}
}
如果想看更多设计模式,可点此链接:设计模式概述 以及 23种设计模式的介绍