中介者模式,属于行为型模式;定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
在java中,类和类的关系几乎都是多对多的关系。这种类和类的交互,非常错综复杂,如果不懂逻辑会看的眼花缭乱,因为耦合性太高了。我们不如弄一个专门的中介,所有的类的都与这个中介进行交互,让这个中介调用其他的类呢?这样的类和类的交互从多对多,变成了一对多;减少了耦合。
注意,这里的中介,和我们现实生活中的这中介意思几乎一模一样,比如:
1:婚介所,你只需要把资料交给中介,中介在对其他多个对象进行筛选。
2:房屋中介,你只需要把房屋信息提交给中介,由中介寻找多个买方。
因为他们都有专门的中介进行交互,所有的后续的事情,都交给了中介,他们只需要和中介这一个单位打交道就行。
中介者模式UML图:
中介者模式模型图Colleague:同事接口,就是我们需要交互对象的抽象类。
ConcreteColleague:同事类,具体需要交互的类。
Mediator:中介者抽象类(当然也可以不需要抽象类,直接使用中介者具体类也行)。
ConcreteMediator:中介者具体类
Demo:
开会的目的就是让大家聚在一起,传达一些精神给所有人,一个人说,其他人听就行,当然也可以轮流说,而不是私下一个一个的去交流,大家一起开会,极大的节省了交流的时间。直接上图:
Colleague:同事抽象类(Colleague)
同事抽象类Zhangsan:同事具体类(ConcreteColleague)
同事具体类Lisi:同事具体类(ConcreteColleague)
同事具体类Mediator:抽象中介者类(Mediator)
抽象中介者类ConcreteMediator:具体中介者类
具体中介者测试结果:
结果以上例子:具体中介者类(ConcreteColleague),管理了所有的同事(Colleague),所有同事在这里面进行注册(registry方法),并对一些同事的动作(say方法),给其他同事做出反应(listen方法)。
一般情况下,我们中介者可以写成单例模式,不需要使用Mediator抽象类。
Java实例:
java中几乎所有的”池“技术(数据库连接池,缓冲池,线程池),中心(调度中心,配置中心等等)都会用到了中介者模式:
1:线程池Executor,持有Runnable的引用,对Runnable进行execute,submit,shutdown等等操作。
2:数据库连接池(ConnectionPool),持有各个链接对象(Connection)。
网友评论