设计模式(十七)中介者模式

1、定义

  定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变他们之间的交互,中介者模式又叫调停模式,是迪米特法则的典型应用。

2、优缺点分析

优点:

  1. 类之间各司其职,符合迪米特法则;
  2. 降低了对象之间的耦合性,使得对象易于独立地被复用;
  3. 将对象间的一对多关联转变为一对一的关联,提高了系统的灵活性,使得系统易于维护和扩展。

缺点:

  1. 中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。

3、UML类图分析

 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法;

具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色;

抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能;

具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要于其他同事对象交互时,由中介者对象负责后续的交互。

4、代码实例

 1 /**
 2  * @author it-小林
 3  * @desc   中介者抽象接口
 4  * @date 2021年08月10日 19:34
 5  */
 6 public interface Mediator {
 7 
 8     void register(Colleague colleague);
 9 
10     void relay(Colleague colleague);
11 }
 1 /**
 2  * @author it-小林
 3  * @desc   具体中介者
 4  * @date 2021年08月10日 19:39
 5  */
 6 public class ConcreteMediator implements Mediator{
 7     private List<Colleague> colleagues = new ArrayList<>();
 8 
 9     @Override
10     public void register(Colleague colleague) {
11         if(!colleagues.contains(colleague)){
12             colleagues.add(colleague);
13             colleague.setMediator(this);
14         }
15     }
16 
17     @Override
18     public void relay(Colleague colleague) {
19         for(Colleague col : colleagues){
20             if(!col.equals(col)){
21                 col.receive();
22             }
23         }
24     }
25 }
 1 /**
 2  * @author it-小林
 3  * @desc   抽象同事类
 4  * @date 2021年08月10日 19:36
 5  */
 6 public abstract class Colleague {
 7 
 8     protected Mediator mediator;
 9 
10     public void setMediator(Mediator mediator) {
11         this.mediator = mediator;
12     }
13 
14     public abstract void receive();
15 
16     public abstract void send();
17 }
 1 /**
 2  * @author it-小林
 3  * @desc   具体同事类1
 4  * @date 2021年08月10日 19:42
 5  */
 6 public class ConcreteColleague1 extends Colleague{
 7     @Override
 8     public void receive() {
 9         System.out.println("具体同事类1收到请求。");
10     }
11 
12     @Override
13     public void send() {
14         System.out.println("具体同事类1发出请求。");
15         mediator.relay(this); //请中介者转发
16     }
17 }
 1 /**
 2  * @author it-小林
 3  * @desc   具体同事类2
 4  * @date 2021年08月10日 19:42
 5  */
 6 public class ConcreteColleague2 extends Colleague{
 7     @Override
 8     public void receive() {
 9         System.out.println("具体同事类2收到请求。");
10     }
11 
12     @Override
13     public void send() {
14         System.out.println("具体同事类2发出请求。");
15         mediator.relay(this); //请中介者转发
16     }
17 }
 1 /**
 2  * @author it-小林
 3  * @desc   测试类
 4  * @date 2021年08月10日 19:44
 5  */
 6 public class Client {
 7     public static void main(String[] args) {
 8         Mediator mediator = new ConcreteMediator();
 9         Colleague c1, c2;
10         c1 = new ConcreteColleague1();
11         c2 = new ConcreteColleague2();
12         mediator.register(c1);
13         mediator.register(c2);
14         c1.send();
15         c2.receive();
16         System.out.println("--------------");
17         c2.send();
18         c1.receive();
19     }
20 }

运行结果截图

5、应用场景

  • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时;
  • 当创建一个运行于多个类之间的对象,又不想生成新的子类时。

6、扩展

通常采用以下两种方法来简化中介者模式,使开发变得更简单。

  1. 不定义中介者接口,把具体中介者对象实现成为单例。
  2. 同事对象不持有中介者,而是在需要的时候直接获取中介者对象并调用。

如本文有侵权行为,请及时与本人联系,多多包涵! 小生初出茅庐,多多指教!

本文来自博客园,作者:it-小林,转载请注明原文链接:https://www.cnblogs.com/linruitao/p/15067857.html

原文地址:https://www.cnblogs.com/linruitao/p/15067857.html