前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中介者模式解密:构建高效通信的秘密武器

中介者模式解密:构建高效通信的秘密武器

作者头像
程序视点
发布2023-09-13 12:36:53
1660
发布2023-09-13 12:36:53
举报
文章被收录于专栏:程序小小事
今天和大家聊一聊中介者模式(Mediator Pattern)

简介

还是把这张概总图放这里。

对于中介者,任谁一听都想到了房产中介~~哈哈。

是的!房产中介的职责和这个中介者模式的职责很类似,就是在买房和卖房之间建立一个桥梁通讯(当然了,我们这个不收费O(∩_∩)O)

中介者模式的意图中介者使各个对象之间不需要显示的相互引用,而是通过一个比较特殊的中介对象使得程序组件间进行通讯,以此来实现减少程序组件之间的耦合。

让我们来想一想,没有房产中介的情况下,房东们是怎么出租房子的。

话说这里有六个房东需要出租房屋,房屋各不相同、各有各的特点、适合不一样的人租住。这六个房东之间刚好有点联系。然后都在出租房屋。

这时租客A来租房,看了一号房东的房子不满意、但是一号房东觉得可以让他去看看其他五个朋友的房间。然后开始联系他的五个朋友。这样运行下去好像有是没有什么问题的。

但这里有一个情况:当任一房东的房子租出去或不想外租的时候,需要通知其他5个房东,告诉他们不用再给自己介绍租客了。

这里的情形是:一个人发生了变化,需要通知其他五个人

如果我们把6个房东都看做一个对象的话,每个对象(每个房东)都需要维护其他5位的状态。假设房东一的房子出租出去了,那其他5个房东都需要在自己的朋友列表中进行修改--记录房东一的房子已出租,不用给他介绍租客了。

同样,哪一天房东一又像继续出租房子了,其他5位也需要修改--房东一的房子又可以出租了,可以给他介绍租客了。

者还只是一个房东在变化,要是多个房东都在变化,一会儿出租,一会儿不出租~~ 呜呜~~这太烦人啦

于是乎!中介出现啦~

六个房东都把房屋交给中介处理。假如房东二的房子已经出租了,那只需要告诉中介,再来租客的时候,不用带租客来看房东二的房子了。咦~是不是发现只需要通知中介就可以啦~

有中介前:需要通知其他5个房东,5个房东还得都做记录修改。

多对多的关系,牵一发动全身!

有中介后:只需要通知中介一个人,中介自己做好记录修改即可。

一对多的关系,一个变动只和中介发生关系,不影响其他!

现在,大家再来理解中介者模式,是不是要简单些呢?

示例代码

这里,我们模拟3个房东。他们分别出租一个单间、两居室和三居室。

先来定一个房东的抽象类。

代码语言:javascript
复制
public abstract class Renter {
    // 房东通知中介房屋情况
    public abstract void sendNotice(String msg);

}

房东和中介有联系,因此我们需要在房东类中维护一个中介对象。先创建一个中介类。

代码语言:javascript
复制
public abstract class Mediator {
  // 中介需要通知其他房东
  public abstract void notice(String msg, Renter msgFromRenter);
}

现在,回头把房东的抽象类完善下。

代码语言:javascript
复制
public abstract class Renter {
  Mediator mediator;
  public Renter(Mediator mediator) {
    this.mediator = mediator;
  }
  // 房东通知中介房屋情况
  public abstract void sendNotice(String msg);
  
  // 房东收到消息
  public abstract void getNotice(String message);
}

实现具体的三个房东。

代码语言:javascript
复制
public class SeparateRoomRenter {
  public SeparateRoomRenter(Mediator mediator) {
    super(mediator);
  }
  // 房东通知中介房屋情况
  public abstract void sendNotice(String msg) {
    this.mediator.notice(msg, this);
  };

  public abstract void getNotice(String message) {
    System.out.println("单间房东收到消息:" +  message);
  }
}
代码语言:javascript
复制
public class TwoRoomRenter {
  public TwoRoomRenter(Mediator mediator) {
    super(mediator);
  }
  // 房东通知中介房屋情况
  public abstract void sendNotice(String msg) {
    this.mediator.notice(msg, this);
  };

  public abstract void getNotice(String message) {
    System.out.println("两居室房东收到消息:" +  message);
  }
}
代码语言:javascript
复制
public class ThreeRoomRenter {
  public ThreeRoomRenter(Mediator mediator) {
    super(mediator);
  }
  // 房东通知中介房屋情况
  public abstract void sendNotice(String msg) {
    this.mediator.notice(msg, this);
  };

  public abstract void getNotice(String message) {
    System.out.println("三居室房东收到消息:" +  message);
  }
}

实现具体的房屋中介。

代码语言:javascript
复制
public class HouseMediator extend Mediator {
  SeparateRoomRenter separateRoomRenter;
  TwoRoomRenter twoRoomRenter;
  ThreeRoomRenter threeRoomRenter;
  // 省略getter和setter
  public abstract void notice(String msg, Renter msgFromRenter) {
    if(msgFromRenter == separateRoomRenter) {
      twoRoomRenter.getNotice(msg);
      threeRoomRenter.getNotice(msg);
    }else if(msgFromRenter == twoRoomRenter) {
      separateRoomRenter.getNotice(msg);
      threeRoomRenter.getNotice(msg);
    }else{
      separateRoomRenter.getNotice(msg);
      twoRoomRenter.getNotice(msg);
    }
  }
}

来测试下。

代码语言:javascript
复制
public class MediatorTest {
  publid static void main(String[] args) {
    // 中介
    Mediator houseMediator = new HouseMediator();
    
    // 房东
    SeparateRoomRenter separateRoomRenter = new SeparateRoomRenter(houseMediator);
    TwoRoomRenter twoRoomRenter = new TwoRoomRenter(houseMediator);
    ThreeRoomRenter threeRoomRenter = new ThreeRoomRenter(houseMediator);
    
    // 中介维护所有房东
    houseMediator.setSeparateRoomRenter(separateRoomRenter);
    houseMediator.setTwoRoomRenter(twoRoomRenter);
    houseMediator.setThreeRoomRenter(threeRoomRenter);
    
    // 现在假设单间房的房东确认租客入住了。就只需通知中介。
    separateRoomRenter.sendNotice("单间租户已入住!");
  }
}

输出:两居室房东收到消息:单间租户已入住!三居室房东收到消息:单间租户已入住!

单间房东之和中介打交道。中介把消息传递给其他房东!重点是:房东之间不在杂乱的相互传递消息,通过中介来处理消息。

总结

中介模式剥离了对象之间的直接通讯,通过中介对象来协作。

具体来说,中介者模式的意图就在于:减少对象之间的混乱关系(那些让人分不清的多对多的关系),通过中介者进行统一管理这些对象,将对象之间的交互封装在中介者的对象里面。

使用场景

  • 系统中对象间存在较为复杂引用,导致依赖关系和结构混乱而无法复用的情况。
  • 想通过一个中间类来封装多个类的行为,但是又不想要太多的子类。

优点

  • 松散耦合、将多个对象之间的联系紧耦合封装到中介对象中,做到松耦合。不会导致一动牵全身。
  • 将多个对象之间的交互联系集中在中介对象中。发送变化仅需修改中介对象即可、提供系统的灵活性、使同事对象独立而易于复用。
  • 符合迪米特原则。就是说一个对象应当对其他对象有尽可能少的了解。减少各个对象之间的了解。

缺点 如果各个同事间的交互非常多并且复杂情况下,都交给中介者会导致中介者变得十分复杂,不易维护和管理。 但这点复杂度,相对“多对多”关系的维护来说,简单太多啦~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-01 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序视点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 示例代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档