设计模式之中介者模式
核心:
同事对象:对象之间存在大量多对多关系
中介者对象:使各个同事对象只跟中介者对象打交道
实例:总经理 研发部 市场部 财务部
Meditor
package com.meditor;
/**
* 中介者接口
*/
public interface Meditor {
void register(String name,Department department);
void command(String name);
}
President
package com.meditor;
import java.util.HashMap;
import java.util.Map;
/**
* 总经理
*/
public class President implements Meditor {
//部门名称,部门工作
private Map<String,Department> map = new HashMap<String, Department>();
@Override
public void register(String name, Department department) {
//加入部门
map.put(name,department );
}
@Override
public void command(String name) {
//命令某个部门工作
map.get(name).selfAction();
}
}
Department
package com.meditor;
/**
* 同事类接口
*/
public interface Department {
void selfAction();//做本部门工作
void outAction();//向总经理发出申请
}
Development
package com.meditor;
/**
* 研发部
*/
public class Development implements Department {
//持有中介者(总经理)的引用
private Meditor m;
public Development(Meditor m) {
super();
this.m = m;
m.register("development",this );
}
@Override
public void selfAction() {
System.out.println("专心科研,开发项目");
}
@Override
public void outAction() {
System.out.println("汇报情况,需要财务支持");
m.command("financial");
}
}
Market
package com.meditor;
/**
* 市场部
*/
public class Market implements Department {
//持有中介者(总经理)的引用
private Meditor m;
public Market(Meditor m) {
super();
this.m = m;
m.register("market",this);//加入市场部
}
@Override
public void selfAction() {
System.out.println("跑业务");
}
@Override
public void outAction() {
System.out.println("汇报情况,项目的进度需要资金支持");
//命令财务部支持市场部
m.command("financial");
}
}
Financial
package com.meditor;
/**
* 财务部
*/
public class Financial implements Department {
//持有中介者(总经理)的引用
private Meditor m;
public Financial(Meditor m) {
super();
this.m = m;
m.register("financial",this );
}
@Override
public void selfAction() {
System.out.println("数钱");
}
@Override
public void outAction() {
System.out.println("汇报工作,怎么花钱");
}
}
Client
package com.meditor;
public class Client {
public static void main(String[] args) {
//总经理
Meditor president = new President();
Development development = new Development(president);//研发部
Financial financial = new Financial(president);//财务部
Market market = new Market(president);//市场部
System.out.println("----------市场部-----------");
market.selfAction();
market.outAction();
System.out.println("----------财务部-----------");
financial.selfAction();
financial.outAction();
System.out.println("----------研发部-----------");
development.selfAction();
development.outAction();
}
}
结果:
----------市场部-----------
跑业务
汇报情况,项目的进度需要资金支持
数钱
----------财务部-----------
数钱
汇报工作,怎么花钱
----------研发部-----------
专心科研,开发项目
汇报情况,需要财务支持
数钱
中介者模式的本质:
解耦多个同事之间的交互关系,每个对象都持有中介者对象的引用,只跟中介者对象打交道,通过中介者统一管理这些对象
常见场景:
1)MVC模式
2)窗口游戏程序
3)图像界面GUI中,多个组件之间的交互,可通过引入一个中介者对象来解决