中介者模式-行为型

时间:2021-08-04
本文章向大家介绍中介者模式-行为型,主要包括中介者模式-行为型使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

模式的定义与特点

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

中介者模式是一种对象行为型模式,其主要优点如下。

  1. 类之间各司其职,符合迪米特法则。

  2. 降低了对象之间的耦合性,使得对象易于独立地被复用。

  3. 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

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

模式的结构与实现

中介者模式实现的关键是找出“中介者”,下面对它的结构和实现进行分析。

1. 模式的结构

中介者模式包含以下主要角色。

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

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

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

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

中介者模式的结构图如图 1 所示。

package net.biancheng.c.mediator;

import java.util.*;

public class MediatorPattern {
   public static void main(String[] args) {
       Mediator md = new ConcreteMediator();
       Colleague c1, c2;
       c1 = new ConcreteColleague1();
       c2 = new ConcreteColleague2();
       md.register(c1);
       md.register(c2);
       c1.send();
       System.out.println("-------------");
       c2.send();
  }
}

//抽象中介者
abstract class Mediator {
   public abstract void register(Colleague colleague);

   public abstract void relay(Colleague cl); //转发
}

//具体中介者
class ConcreteMediator extends Mediator {
   private List<Colleague> colleagues = new ArrayList<Colleague>();

   public void register(Colleague colleague) {
       if (!colleagues.contains(colleague)) {
           colleagues.add(colleague);
           colleague.setMedium(this);
      }
  }

   public void relay(Colleague cl) {
       for (Colleague ob : colleagues) {
           if (!ob.equals(cl)) {
              ((Colleague) ob).receive();
          }
      }
  }
}

//抽象同事类
abstract class Colleague {
   protected Mediator mediator;

   public void setMedium(Mediator mediator) {
       this.mediator = mediator;
  }

   public abstract void receive();

   public abstract void send();
}

//具体同事类
class ConcreteColleague1 extends Colleague {
   public void receive() {
       System.out.println("具体同事类1收到请求。");
  }

   public void send() {
       System.out.println("具体同事类1发出请求。");
       mediator.relay(this); //请中介者转发
  }
}

//具体同事类
class ConcreteColleague2 extends Colleague {
   public void receive() {
       System.out.println("具体同事类2收到请求。");
  }

   public void send() {
       System.out.println("具体同事类2发出请求。");
       mediator.relay(this); //请中介者转发
  }
}

原文地址:https://www.cnblogs.com/wsyphaha/p/15099495.html