中介模式Mediator
如果一个系统中对象之间呈现网状结构,关系复杂,则可以引入一个中介者对象,由中介者和其他对象打交道。
1.使用场景
假设没有总经理,有三个部门,财务部,调研部,研发部。财务部要发工作,要通知调研部和研发部,调研部调研需要财务支持和研发部支持。每个部门之间都要打交道。关系非常乱。实际上,每个公司都要总经理,每个部门有什么事都报道到总经理这里,总经理在通知相关部门。
这就是典型的中介者模式,总经理起到一个中介协调的作用。
- 通过让对象彼此解耦,增加对象的复用性
- 通过将控制逻辑集中,可以简化系统维护
2.组成
• 抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
• 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体 的同事类那里接收信息,并且向具体的同事类发送信息。
• 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
• 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
3.
package com.liang.mediator;
import java.util.HashMap;
import java.util.Map;
/**
*经理
*抽象中介者(Mediator)和具体中介者(ConcreteMediator)类,把部门存储到map中便于调用
*/
public interface Mediator {
void receiveReq(String dname);
void regiset(String dname,Department d);
}
class Manager implements Mediator{
private Map<String,Department> map=new HashMap<>();
@Override
public void receiveReq(String dname) {
// TODO 自动生成的方法存根
map.get(dname).dealThings();
}
@Override
public void regiset(String dname, Department d) {
map.put(dname, d);
}
}
package com.liang.mediator;
/**
*部门
* 抽象同事类(Colleague)和具体同事类
*/
public interface Department {
void outReq();
void dealThings();
}
class A implements Department{
private Mediator m;
public A(Mediator m) {
super();
this.m = m;
m.regiset("A",this);
}
@Override
public void outReq() {
// TODO 自动生成的方法存根
System.out.println("需要得到B部门的支持");
m.receiveReq("B");
}
@Override
public void dealThings() {
// TODO 自动生成的方法存根
System.out.println("调研部");
}
}
class B implements Department{
private Mediator m;
public B(Mediator m) {
super();
this.m = m;
m.regiset("B",this);
}
@Override
public void outReq() {
// TODO 自动生成的方法存根
System.out.println("需要得到C部门的支持");
m.receiveReq("C");
}
@Override
public void dealThings() {
// TODO 自动生成的方法存根
System.out.println("财务部:发钱");
}
}
package com.liang.mediator;
public class Client {
public static void main(String[] args) {
Mediator manager=new Manager();
Department a=new A(manager);
Department b=new B(manager);
a.dealThings();
a.outReq();
}
}