中介者模式介绍
用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互
中介者模式的核心:
- 就是将网状结构处理成星型结构
- 将多对多处理成一对多
例如:国家跟国家之间的交流 可以通过联合国这么一个中介对象来维护管理
模式结构图
该模式的四大主角
Colleague(抽象同事类)
ConcreteColleague(具体同事类)
Mediator(抽象中介者)
ConcreteMediator(具体中介者对象)
Colleague(抽象同事类)
ConcreteColleague(具体同事类)
中介者模式的适用场景:
一组定义良好的对象,现在要进行复杂的相互通信。
想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
优点:
简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
提供系统的灵活性,使得各个同事对象独立而易于复用。
缺点:
中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。例如,QQ游戏中计算欢乐豆的程序出错了,这样会造成重大的影响。
//抽象中介者
public interface Mediator {
void register(String dname,Department d);//将具体的同事类注册到中介者中,让中介者知道所有的同事。以便进行交互
void command(String dname);//通过部门名称,发出命令
}
//抽象同事类:部门
public interface Department {
void selfAction();//做本部门的事
void outAction();//向总经理发出申请
}
//具体同事类:研发部
public class Development implements Department{
private Mediator m;//中介者(总经理)
//构造的时候将中介者构造进来
public Development(Mediator m) {
super();
this.m = m;
//ConcreteMediator(具体中介者对象):实现抽象中介者的方法
//它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
m.register("development", this);//将当前部门对象注册到中介者对象中,
}
@Override
public void selfAction() {
System.out.println("研发部:正在研发项目......");
}
@Override
public void outAction() {
System.out.println("研发部向总经理说:项目经费没了.....");
}
}
//具体同事类:财务部
public class Finacial implements Department{
private Mediator m;//中介者(总经理)
//构造的时候将中介者构造进来
public Finacial(Mediator m) {
super();
this.m = m;
//ConcreteMediator(具体中介者对象):实现抽象中介者的方法
//它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
m.register("finacial", this);//将当前部门对象注册到中介者对象中,
}
@Override
public void selfAction() {
System.out.println("财务部:会计正在核对财务......");
}
@Override
public void outAction() {
System.out.println("财务部向总经理说:钱很多,花不完.....");
}
}
//具体同事类:市场部
public class Market implements Department{
private Mediator m;//中介者(总经理)
//构造的时候将中介者构造进来
public Market(Mediator m) {
super();
this.m = m;
//ConcreteMediator(具体中介者对象):实现抽象中介者的方法
//它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
m.register("market", this);//将当前部门对象注册到中介者对象中,
}
@Override
public void selfAction() {
System.out.println("市场部:正在跑市场......");
}
@Override
public void outAction() {
System.out.println("市场部向总经理说:合同已搞定,需财务部报销.....");
m.command("finacial");//通过总经理这个中介,向总经理发出申请,告知需要跟财务部交互报销经费
}
}
//中介者的具体实现:总经理
public class President implements Mediator{
//总经理也需要知道所有具体同事类
private Map<String,Department> map = new HashMap<String,Department>();
@Override
public void register(String dname, Department d) {
map.put(dname, d);//将同事注册到总经理的所有同事类容器中
}
@Override
public void command(String dname) {
map.get(dname).selfAction();//根据部门名称向具体的部门下命令
}
}
public static void main(String[] args) {
Mediator m = new President();//构建中介者对象:总经理
Market market = new Market(m);//构建市场部
market.selfAction();
market.outAction();//市场部和财务部交互
}