中介者模式
中介者模式(Mediator Pattern):又称为调节者模式或者调停者模式,是用来降低多个对象和类之间的通信复杂性。中介者模式中用一个中介对象封装一系列的对象交互,从而使各个对象不需要显示的相互作用,达到松耦合的目的。这样如果某些对象之间的作用发生改变时,不会立刻影响其它的一些对象之间的作用,保证了对象之间的相互作用可以独立的变化。
中介者模式属于行为型模式,其核心思想是通过中介者对象解耦各层次对象的直接耦合,层次对象的对外依赖通信全部交由中介者转发。
当下,微服务框架比较火热,我们知道,微服务的注册中心主要用来统一管理各个微服务的,不然,各个微服务之间的相关调用就会形成一个特别混乱的网状,难以管理。而注册中心的出现就避免了各个微服务之间互相依赖的乱象,那这里的注册中心就是一个中介者的角色。
示例:我们就简单模拟注册中心来举例说明...
package cn.liangyy.mediator;
/**
* 抽象服务类
*/
public abstract class AbstractService {
//中介者对象
protected AbstractMediator mediator;
public AbstractService(AbstractMediator mediator){
this.mediator = mediator;
}
public abstract void doSomething();
}
复制代码
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();
}
}
复制代码
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();
}
}
复制代码
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();
}
复制代码
package cn.liangyy.mediator;
/**
* 中介者对象注册中心类
*/
public class RegisterCenter extends AbstractMediator {
/**
* 下面这两个方法也一样,一般每个微服务都需要对应一个方法
*/
@Override
public void callServiceA() {
super.serviceA.doSomething();
}
@Override
public void callServiceB() {
super.serviceB.doSomething();
}
}
复制代码
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 个维度之间的解耦:一个抽象,一个具体。而中介者模式侧重的是将多个相同类型对象之间的关联关系进行统一管理。
中介者模式适用场景比如租房中介、买房中介等,还有像我们的群聊、聊天室等等
中介者模式优点
中介者模式缺点中介者模式各个对象之间也称之为同事对象,而当我们的同事角色非常多的时候,中介者对象需要维护非常多的同事角色对象,会使得中介者变得非常庞大,导致难以维护。
评论