-
Notifications
You must be signed in to change notification settings - Fork 0
中介者模式(调停者模式)
ZHI-XINHUA edited this page Jan 11, 2019
·
1 revision
调停者模式又叫中介者模式,它是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明细引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发送改变时,不会立刻影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地编号。 遵循:迪米特法则
角色:
- 抽象同事类角色(Colleague):定义调停者到同事对象的接口。同事对象只知道调停者而不知道其它同事对象。
- 具体同事类角色(ConcreteColleague):实现同事类接口,实现自己行为
- 抽象调停者角色(Mediator):定义出同事对象到调停者对象的接口
- 具体调停者角色(ConcreteMediator):实现调停者的行为。具体调停者知晓所有具体同事对象。 它从具体同事对象接受消息、向具体同事对象发出指令。
没有WTO时,世界贸易是这样的:
WTO成立之后,使得各个贸易地区之间的强大关联转换成松散的耦合关系,如下图
所以,在这个例子中,WTO就是起到一个调停者的角色。
公司里面财务部和市场部不直接打交道,通过总经理协调它们日常的工作。总经理就是调停者。
uml如下:
(1)定义部门接口并定义其行为(抽象同事类角色)
/**
* 部门接口
* 抽象同事类角色:定义调停者到同事对象的接口。同事对象只知道调停者而不知道其它同事对象
*/
public interface Department {
/**
* 自己部门处理的事情
*/
void myAction();
/**
* 向领导汇报的事情
*/
void outAction();
}
(2)财务部、市场部 它们之间没有直接的关联,但是可以直接和总经理打交道(即都持有总经理的引用)
/**
* 财务部
* 具体同事类角色:实现同事类接口,实现自己行为
*/
public class Finacial implements Department {
//持有调停者(总经理)的引用
private ExecutiveLeader leader;
public Finacial(ExecutiveLeader leader){
this.leader = leader;
leader.register("finacial",this);
}
@Override
public void myAction() {
System.out.println("财务部:数钱,清点资金....");
}
@Override
public void outAction() {
System.out.println("财务部:经过一番努力,资金已经准备好!");
}
}
/**
* 市场部
* 具体同事类角色:实现同事类接口,实现自己行为
*/
public class Market implements Department {
// 持有调停者(总经理)的引用
private ExecutiveLeader leader;
public Market(ExecutiveLeader leader){
leader = leader;
leader.register("market",this);
}
@Override
public void myAction() {
System.out.println("市场部:筹备市场推广中。");
}
@Override
public void outAction() {
System.out.println("市场部:申请经费:需要资金市场搞推广活动。");
}
}
(3) 领导接口,具有管理部门的行为
/**
* 行政领导接口
* 抽象调停者角色:定义出同事对象到调停者对象的接口
*/
public interface ExecutiveLeader {
/**
* 组织架构,管理协调部门
* @param dname
* @param d
*/
void register(String dname,Department d);
/**
* 指示命令
* @param dname
*/
void command(String dname);
}
(4)总经理(具体调停者角色),协调各个部门日常工作
/**
* 总经理
* 具体调停者角色:实现调停者的行为。具体调停者知晓所有具体同事对象。 它从具体同事对象接受消息、向具体同事对象发出指令。
*/
public class GeneralManager implements ExecutiveLeader {
//存放组织架构的管理信息 ,管理部门
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) {
System.out.println("总经理:已阅,下面部门尽快解决");
map.get(dname).myAction();
}
}
测试
public static void main(String[] args) {
//总经理,调停者角色
ExecutiveLeader leader = new GeneralManager();
//市场部
Market market = new Market(leader);
//财务部
Finacial finacial = new Finacial(leader);
market.myAction();//市场部内部事情
market.outAction();//市场部需要财务部协助,向总经理申请
leader.command("finacial");//总经理发出指令,财务部干事
}
市场部:筹备市场推广中。
市场部:申请经费:需要资金市场搞推广活动。
总经理:已阅,下面部门尽快解决
财务部:数钱,清点资金....
-
MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交道)
-
Java.lang.reflect.Method#invoke()
设计模式