中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)

定义

又称为调解者模式,或调停者模式。

中介者模式定义了一个中介对象来封装一系列对象之间的交互,使得这些对象不需要直接相互通信,而是通过与中介者进行通信。

通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。

属于行为型模式。

特点:

  • 解耦关联对象:通过引入中介者来减少各个相关对象之间的直接依赖关系。
  • 集中控制逻辑:将复杂的交互逻辑集中在一个中介者类中管理和处理。
  • 促进可扩展性:新添加或修改现有相关对象时,只需修改或扩展中介者类而无需改变其他部分。
  • 降低耦合性:各个对象只需要知道中介者对象,而无需了解其他对象的具体细节。

适用场景:

  1. 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
  2. 交互的公共行为,如果需要改变行为则可以增加新的中介者类。

标准示例

  • 抽象中介者(Mediator):定义中介者的接口,用于封装对象之间的交互行为。它持有其他具体同事类的引用。
java 复制代码
/**
 * 抽象中介者
 */
public abstract class Mediator {
    protected ConcreteColleagueA colleagueA;
    protected ConcreteColleagueB colleagueB;

    public void setColleagueA(ConcreteColleagueA colleagueA){
        this.colleagueA = colleagueA;
    }

    public void setColleagueB(ConcreteColleagueB colleagueB){
        this.colleagueB = colleagueB;
    }

    //中介者业务方法
    public abstract void transferA();

    public abstract void transferB();

}
  • 具体中介者(ConcreteMediator):实现抽象中介者的接口,通过协调各个同事对象来实现协作。包括了具体的调用方向。
java 复制代码
public class ConcreteMediator extends Mediator{
    public void transferA() {
        //调用B的方法
        colleagueB.methodB();
    }

    public void transferB(){
        //调用A的方法
        colleagueA.methodA();
    }
}
  • 抽象同事类(Colleague):定义与中介者对象进行通信的接口。包含了对抽象中介者的引用,实际中是指向具体中介者。
java 复制代码
/**
 * 抽象同事类
 */
public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }
}
  • 具体同事类(ConcreteColleague):实现抽象同事类,并持有中介者的引用,通过中介者与其他同事对象进行通信。
java 复制代码
public class ConcreteColleagueA extends Colleague{
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
        this.mediator.setColleagueA(this);
    }

    public void methodA(){
        System.out.println(String.format("The method of %s ",this.getClass().getSimpleName()));
    }

    public void dependentMethodA(){
        System.out.println(String.format("The dependent method of %s ",this.getClass().getSimpleName()));
        this.mediator.transferA();
    }

}
java 复制代码
public class ConcreteColleagueB extends Colleague{
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
        this.mediator.setColleagueB(this);
    }

    public void methodB(){
        System.out.println(String.format("The method of %s ",this.getClass().getSimpleName()));
    }

    public void dependentMethodB(){
        System.out.println(String.format("The dependent method of %s ",this.getClass().getSimpleName()));
        this.mediator.transferA();
    }
}

客户端代码:

java 复制代码
public class ClientTest {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();
        ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
        ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

        colleagueA.dependentMethodA();
        System.out.println();
        colleagueB.dependentMethodB();
    }
}

执行结果:

shell 复制代码
The dependent method of ConcreteColleagueA 
The method of ConcreteColleagueB 

The dependent method of ConcreteColleagueB 
The method of ConcreteColleagueB 

以上就是 中介者模式的全部内容,感谢阅读。

相关推荐
消失的旧时光-194311 小时前
人脸跟随 ( Channel 实现(缓存5条数据 + 2度过滤 + 平滑移动))
android·java·开发语言·kotlin
默默coding的程序猿11 小时前
1.单例模式有哪几种常见的实现方式?
java·开发语言·spring boot·spring·单例模式·设计模式·idea
编程岁月11 小时前
java面试-0136-BIO、NIO、AIO区别?
java·面试·nio
春生野草11 小时前
部署项目到Tomcat
java·tomcat
安逸sgr11 小时前
SpringMVC启动流程
java·jvm·spring·spring cloud·eclipse·tomcat·maven
lifallen12 小时前
从Apache Doris 学习 HyperLogLog
java·大数据·数据仓库·算法·apache
fire-flyer12 小时前
maven-jlink-plugin入门
java·maven
Knight_AL12 小时前
Java 单元测试全攻略:JUnit 生命周期、覆盖率提升、自动化框架与 Mock 技术
java·junit·单元测试
bkspiderx12 小时前
C++设计模式之行为型模式:迭代器模式(Iterator)
c++·设计模式·迭代器模式
cominglately12 小时前
记录一次生产环境数据库死锁的处理过程
java·死锁