写点什么

MediatorPattern- 中介者模式

作者:梁歪歪 ♚
  • 2022 年 6 月 05 日
  • 本文字数:2488 字

    阅读完需:约 8 分钟

MediatorPattern-中介者模式

中介者模式

中介者模式(Mediator Pattern):又称为调节者模式或者调停者模式,是用来降低多个对象和类之间的通信复杂性。中介者模式中用一个中介对象封装一系列的对象交互,从而使各个对象不需要显示的相互作用,达到松耦合的目的。这样如果某些对象之间的作用发生改变时,不会立刻影响其它的一些对象之间的作用,保证了对象之间的相互作用可以独立的变化。


中介者模式属于行为型模式,其核心思想是通过中介者对象解耦各层次对象的直接耦合,层次对象的对外依赖通信全部交由中介者转发。


当下,微服务框架比较火热,我们知道,微服务的注册中心主要用来统一管理各个微服务的,不然,各个微服务之间的相关调用就会形成一个特别混乱的网状,难以管理。而注册中心的出现就避免了各个微服务之间互相依赖的乱象,那这里的注册中心就是一个中介者的角色。


示例:我们就简单模拟注册中心来举例说明...


  • 抽象服务类AbstractService.java


package cn.liangyy.mediator;
/** * 抽象服务类 */public abstract class AbstractService { //中介者对象 protected AbstractMediator mediator; public AbstractService(AbstractMediator mediator){ this.mediator = mediator; }
public abstract void doSomething();}
复制代码


  • 具体服务ServiceA.java


package cn.liangyy.mediator;
/** * 具体服务 A */public class ServiceA extends AbstractService { public ServiceA(AbstractMediator mediator){ super(mediator); }
@Override public void doSomething() { //这个方法是服务A自己的业务 System.out.println("我是 Service A"); }
public void callB(){ //先完成自己的业务 this.doSomething(); //紧接着服务A调用B的方法 System.out.println("调用 Service B"); //通过中介者调用服务B的方法 mediator.callServiceB(); }}
复制代码


  • 具体服务ServiceB.java


package cn.liangyy.mediator;
/** * 具体服务 B */public class ServiceB extends AbstractService { public ServiceB(AbstractMediator mediator){ super(mediator); }
@Override public void doSomething() { //这个方法是服务B自己的业务 System.out.println("我是 Service B"); }
public void callA(){ //先完成自己的业务 this.doSomething(); //紧接着服务B调用B的方法 System.out.println("调用 Service A"); //通过中介者调用服务A的方法 mediator.callServiceA(); }}
复制代码


  • 抽象中介者对象AbstractMediator.java


package cn.liangyy.mediator;
/** * 抽象中介者类 */public abstract class AbstractMediator { //持有服务A protected AbstractService serviceA; //持有服务B protected AbstractService serviceB;
public void setServiceA(AbstractService serviceA){ this.serviceA = serviceA; }
public void setServiceB(AbstractService serviceB){ this.serviceB = serviceB; }
/** * 下面这两个方法也一样,一般每个微服务都需要对应一个方法 */ //调用服务 A 方法 public abstract void callServiceA(); //调用服务 B 方法 public abstract void callServiceB();}
复制代码


  • 中介者对象注册中心类RegisterCenter.java


package cn.liangyy.mediator;
/** * 中介者对象注册中心类 */public class RegisterCenter extends AbstractMediator { /** * 下面这两个方法也一样,一般每个微服务都需要对应一个方法 */ @Override public void callServiceA() { super.serviceA.doSomething(); }
@Override public void callServiceB() { super.serviceB.doSomething(); }}
复制代码


  • 测试TestMediator.java


package cn.liangyy.mediator;
/** * 中介者模式-测试 */public class TestMediator { public static void main(String[] args) { //构建一个中介者对象 AbstractMediator registerCenter = new RegisterCenter(); //将每个对象初始化进中介者对象 ServiceA serviceA = new ServiceA(registerCenter); ServiceB serviceB = new ServiceB(registerCenter);
registerCenter.setServiceA(serviceA); registerCenter.setServiceB(serviceB);
//服务A调用服务B,实际上A内部是通过中介者调用的,B和A本身没有依赖 serviceA.callB(); System.out.println("**********************"); serviceB.callA(); }}
复制代码


由上述例子,我们可以看到,服务 A 和服务 B 互相调用,但都不持有对方的引用,而是通过中介者对象来统一管理的,如果后续有其他服务的调用,那么只需要改变中介者就可以了。


中介者模式和桥接模式的区别上一篇博客我们学习了桥接模式,看起来和这里的中介者模式有点相似的感觉。其实这两种设计模式的思想是一样的,只是这两种模式的侧重点和应用场景不一致。


桥接模式侧重的是将抽象和具体进行解耦,一般就是特指 2 个维度之间的解耦:一个抽象,一个具体。而中介者模式侧重的是将多个相同类型对象之间的关联关系进行统一管理。


中介者模式适用场景比如租房中介、买房中介等,还有像我们的群聊、聊天室等等


  • 系统中的对象存在非常复杂的引用关系,而且相互依赖,导致依赖关系非常复杂时。

  • 当我们想要使用多个类之间的行为时,为了避免过多的使用继承,可以考虑使用中介者来实现。


中介者模式优点


  • 减少了类之间的相互依赖性,将多对多依赖转化成为了一对多依赖,降低了类间的耦合。

  • 使用了中介者模式之后,各个类都各司其职,符合了迪米特法则。


中介者模式缺点中介者模式各个对象之间也称之为同事对象,而当我们的同事角色非常多的时候,中介者对象需要维护非常多的同事角色对象,会使得中介者变得非常庞大,导致难以维护。

发布于: 2022 年 06 月 05 日阅读数: 5
用户头像

梁歪歪 ♚

关注

时间带走了年少轻狂,无知沉淀了冷暖自知。 2021.07.22 加入

互联网行业摸爬滚打的Java后生一枚,希望在InfoQ能够充实自己的同时,结识更多大牛。 关于文章,希望大佬们多加指正建议,觉得对你提供了帮助,可以点赞收藏,我在评论区等你们哦~

评论

发布
暂无评论
MediatorPattern-中介者模式_设计模式_梁歪歪 ♚_InfoQ写作社区