设计模式之中介者模式

文章目录

概述

中介模式(mediator pattern)的定义: 定义一个单独的(中介)对象,来封装一组对象之间的交互,将这组对象之间的交互委派给予中介对象交互,来避免对象之间的交互。

中介者对象就是用于处理对象与对象之间的直接交互,封装了多个对象之间的交互细节。中介模式的设计跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系从多对多的网状关系转换为一对多的星状关系。原来一个对象要跟N个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低代码的复杂度,提高代码的可读性和可维护性。

中介者模式原理

中介者模式包含以下主要角色:

  • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

  • 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

  • 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

  • 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

中介者模式实现

java 复制代码
public interface Colleague {  
    void setMediator(Mediator mediator);  
    void receiveMessage(String message);  
    // 其他业务方法...  
}

public class ConcreteColleagueA implements Colleague {  
    private Mediator mediator;  
  
    @Override  
    public void setMediator(Mediator mediator) {  
        this.mediator = mediator;  
    }  
  
    @Override  
    public void receiveMessage(String message) {  
        System.out.println("Colleague A received message: " + message);  
        // 可以在这里执行其他操作...  
    }  
  
    // 假设Colleague A有一个方法需要通知其他同事  
    public void someOperation() {  
        mediator.notifyColleagueB("Hello from A!");  
    }  
}  
  
public class ConcreteColleagueB implements Colleague {  
    private Mediator mediator;  
  
    @Override  
    public void setMediator(Mediator mediator) {  
        this.mediator = mediator;  
    }  
  
    @Override  
    public void receiveMessage(String message) {  
        System.out.println("Colleague B received message: " + message);  
        // 可以在这里执行其他操作...  
    }  
  
    // 假设Colleague B有一个方法需要通知其他同事(此处为了简单起见,未实现)  
    // ...  
}

public interface Mediator {  
    void registerColleague(Colleague colleague);  
    void notifyColleagueB(String message); // 假设只通知B  
    // 可以添加其他通知方法,如notifyColleagueA等  
}  
  
public class ConcreteMediator implements Mediator {  
    private ConcreteColleagueA colleagueA;  
    private ConcreteColleagueB colleagueB;  
  
    @Override  
    public void registerColleague(Colleague colleague) {  
        if (colleague instanceof ConcreteColleagueA) {  
            colleagueA = (ConcreteColleagueA) colleague;  
            colleagueA.setMediator(this);  
        } else if (colleague instanceof ConcreteColleagueB) {  
            colleagueB = (ConcreteColleagueB) colleague;  
            colleagueB.setMediator(this);  
        }  
    }  
  
    @Override  
    public void notifyColleagueB(String message) {  
        if (colleagueB != null) {  
            colleagueB.receiveMessage(message);  
        }  
    }  
  
    // 可以添加其他通知方法...  
}

小结

这篇主要写了中介者模式的定义,原理,以及代码实现。对于这个设计模式来说,主要还是对象行为的。其实,设计模式主要就是对象行为或者类行为的。抓住这个关键点,学习起来就容易多了。OK,翻篇。

相关推荐
希洛兔3 小时前
状态模式详解:让对象随内部状态自动改变行为
java·设计模式·状态模式
博风6 小时前
7、设计模式应用举例:策略模式:加密、解密文件
设计模式·策略模式
4SAPI6 小时前
Provider Adapter设计模式:如何让AI应用支持多个模型
网络·人工智能·设计模式
geovindu8 小时前
rust: pool Pattern
开发语言·后端·设计模式·rust·对象池简写模式
高晶8 小时前
ARM 嵌入式 Linux 开发:从体系结构到 LED 点亮实战
设计模式·程序员
VimorphTech9 小时前
接入两套 TTS 接口后,业务代码如何避免堆满 if/else?
设计模式
geovindu11 小时前
rust: pool Pattern (续)
开发语言·后端·设计模式·rust·对象池简写模式
2302_805771071 天前
Day23:POM设计模式(封装)
java·开发语言·设计模式
范中勤2 天前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
浅尝辄止;2 天前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#