设计模式--中介者模式

  1. 中介者模式可以提供双方的媒介,而代理者模式只能代理其中的一方

  2. 终结者模式用一个终结对象类封装一系列的对象交互,中介者使各对象不需要显式的相互引用,达到解耦的效果,并且可以独立的改变他们之间的交互。

  3. 中介者模式的UML图

    在这里插入图片描述

  4. Mediator抽象中介者模式;ConcreteMediator具体中介者,需要知道所有具体同事类,同时需要从具体同事类那里接受信息,并且向具体同事类发送信息;Colleague抽象同事类;ConcreteColleague具体同事类,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

  5. 在中介者模式中中介者对象处于核心地位,因为它定义了整个系统中所有具体同事类之间的关系,在整个系统中它主要承担两方面的责任。充当了消息中转站的角色。

  6. 中介者模式的代码实现

    1. 创建一个抽象中介者类

      /**
       * 抽象中介者,收集信息、转发信息
       */
      public abstract class Mediator {
      
          public abstract void contact(String message, Person person);
      
      }
      
    2. 创建一个抽象同事类

      /**
       * 抽象同事类
       */
      public abstract class Person {
      
          Mediator mediator;
          String name;
      
          public Person(Mediator mediator, String name) {
              this.mediator = mediator;
              this.name = name;
          }
      
      }
      
    3. 创建两个具体同事类

      /**
       * 具体同事类,房屋拥有者
       */
      public class HouseOwner extends Person {
      
          public HouseOwner(Mediator mediator, String name) {
              super(mediator, name);
          }
      
          /**
           * 联系中介者
           * @param message
           */
          public void contact(String message){
              mediator.contact(message, this);
          }
      
          /**
           * 获取信息
           * @param message
           */
          public void getMessage(String message){
              System.out.println("我是房主,我有房,我叫: " + name +", 接收到了您的信息: " + message);
          }
      
      }
      
      /**
       * 具体同事类,租房者
       */
      public class HouseTenent extends Person{
      
          public HouseTenent(Mediator mediator, String name) {
              super(mediator, name);
          }
      
          /**
           * 联系中介者
           * @param message
           */
          public void contact(String message){
              mediator.contact(message, this);
          }
      
          /**
           * 获取信息
           * @param message
           */
          public void getMessage(String message){
              System.out.println("我是租房的,我没房,我叫:" + name + ", 接收到了您的信息: " + message);
          }
      }
      
    4. 创建一个具体中介者类

      /**
       * 具体中介者类
       */
      public class ConcreteMediator extends Mediator {
      
          private HouseOwner houseOwner;
          private HouseTenent houseTenent;
      
          /**
           * 发送信息给具体同事类
           * @param message
           * @param person
           */
          @Override
          public void contact(String message, Person person) {
              if(person == houseOwner){
                  //中介者帮助卖方者向买房者发送信息
                  houseTenent.getMessage(message);
              } else if(person == houseTenent){
                  //中介者帮助买房者向卖方者发送信息
                  houseOwner.getMessage(message);
              } else {
                  System.out.println("无人接受");
              }
          }
      
          public HouseOwner getHouseOwner() {
              return houseOwner;
          }
      
          public void setHouseOwner(HouseOwner houseOwner) {
              this.houseOwner = houseOwner;
          }
      
          public HouseTenent getHouseTenent() {
              return houseTenent;
          }
      
          public void setHouseTenent(HouseTenent houseTenent) {
              this.houseTenent = houseTenent;
          }
      }
      
      
    5. 创建测试类

      public class Test {
          public static void main(String[] args) {
              ConcreteMediator concreteMediator = new ConcreteMediator();
              HouseOwner houseOwner = new HouseOwner(concreteMediator, "卖家--小张");
              HouseTenent houseTenent = new HouseTenent(concreteMediator, "买家--小李");
      
              concreteMediator.setHouseOwner(houseOwner);
              concreteMediator.setHouseTenent(houseTenent);
      
              houseOwner.contact("我有3套房,打算卖一套,100万,不讲价");
              houseTenent.contact("我有200万,我要买房");
          }
      }
      
  7. 代理模式与中介者模式的区别

    代理模式只代表其中的一方,信息的传输是单向的;中介中模式代表双方,信息的传输是双向的

  8. 中介者模式的优点

    1. 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使系统成为松耦合的系统
    2. 减少了子类的生成
    3. 可以减少各同事类的设计与实现
  9. 中介者模式的缺点

    由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。

  10. 中介者模式的使用场景

    1. 系统中对象之间存在比较复杂的引用关系,导致他们之间的依赖关系混乱而且难以复用该对象。
    2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
  11. JDK中对中介者模式的使用

    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值