什么是中介者模式
概括
中介者模式就是有一个中介类,里面存储者各个工作的“同事类”,当有一些功能需要共同调用多个类的不同方法时,就在中介类中对同事类进行调用和实现(在中介类中实现功能)。
模式结构
- 抽象中介者(Mediator):定义了同事对象到中介者对象的接口。
- 具体中介者(ConcreteMediator):具体中介者对象,实现了抽象类方法,它需要知道所有具体同事类,并从具体同事对象接收消息,向其他同事类发送命令。
- 抽象同事类(Colleague):定义抽象同事类中方法。
- 具体同事类(ConcreteColleague):具体同事类,每个具体同事类只知道自己的行为,而不了解其他同事的情况,但他们都认识中介者对象。
中介者模式的实现
题目
超市有三个角色部门:销售部门、仓库部门、采购部门。这三个部门之间是相互依赖的。采购部门要根据销售部门的销售情况确定是否采购,也需要根据仓库的库存量决定是否采购,而销售部门只有在仓库部门有库存的情况下才能正常销售。
题目分析
这里有3个部门3个类,分别需要实现:
1.采购类中的 判断是否需要采购功能
2.销售类中的 判断是否可以销售功能,进行产品销售情况统计
3.仓库类中的 数据采集统计功能
在功能1,2中判断条件都为仓库类中的数据,而1还要对销售类的销售情况进行读取判断。这样在类1就要调用类2,3的两个对象,在类2要调用类3对象。每个类都与其他两个类产生了关联,根据迪米特法则,每个类只和朋友类交流,这个朋友类,并不是越多越好,朋友类越多,耦合性越大,想要修改一个类就得修改一大片,这不是面向对象设计所期望的,况且这里还是只有三个部门的情况,现实中,一个公司可能会有几十个部门,并且各个部门之间也都是存在关联的,形成了一个蜘蛛网的结构,如果按照上面方式进行编码的话,单单维护起来就已经让人头大了。所以,我们必须对上面的代码进行重新设计。
这时使用中介者模式,在中介者类进行功能的实现与调用即可。
具体实现
同事类:
public abstract class Colleague {
public abstract void input();
public abstract void output() ;
}
public class Buyer extends Colleague{
private Mediator m;//持有中介者对象引用
public Buyer(Mediator m)
{
this.m=m;
m.register("Buyer", this);
}
public void input() {
System.out.println("采购");
}
public void output() {
m.command("Sell");
m.command("Store");
}
}
public class Sell extends Colleague{
private Mediator m;//持有中介者对象引用
public Sell(Mediator m)
{
this.m=m;
m.register("Sell", this);
}
public void input() {
System.out.println("统计销售情况");
}
public void output() {
m.command("Store");
}
}
public class Store extends Colleague{
private Mediator m;//持有中介者对象引用
public Store(Mediator m)
{
this.m=m;
//先在中介上记录自己的类
m.register("Store", this);
}
public void input() {
System.out.println("统计数量");
}
//需要多类协调工作
public void output() {
}
}
中介者:
public interface Mediator {
void register(String name,Colleague d);//记录所有同事类
void command(String name);//发出命令
}
public class Media implements Mediator{
private Map<String,Colleague> map=new HashMap<String,Colleague>();
@Override
public void register(String name, Colleague d) {
map.put(name, d);
}
@Override
public void command(String name) {
map.get(name).input();
}
}
Client:
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//先建立中介者
Mediator m=new Media();
Sell sell=new Sell(m);
Store store=new Store(m);
Buyer buyer =new Buyer(m);
sell.input();
System.out.println("");
sell.output();
System.out.println("");
buyer.input();
System.out.println("");
buyer.output();
}
}
输出:
统计销售情况
统计数量
采购
统计销售情况 统计数量
总结
中介者模式的优点就是减少了类间的依赖,把原有的一对多的依赖变成了一对一的依赖,降低了类间的耦合。中介者模式的缺点就是中介者会膨胀的很大,而且逻辑复杂,同事类越多,中介者的逻辑就越复杂。中介者模式适用于多个对象之间紧密耦合的情况,紧密耦合的标准是:在类图中出现了蜘蛛网状结构。