中介者模式实战运用(类与类之间解耦)

目录

前言

UML

plantuml

类图

实战代码

模板

Colleague

Mediator

Client

中间件


前言

在类设计中,一个类的功能实现可能还依赖其它类,甚至存在两个类之间互相依赖,你中有我,我中有你。表现在代码中就是类往往直接持有另外一个类的引用,类与类之间严重耦合,一个类的修改可能会影响到其他的类,不好维护。

中介者模式即是将对象之间的交互逻辑抽取出来,通过中介者来管理,使得对象之间无需直接引用,降低对象之间的耦合。集中管理交互逻辑相对更加容易维护。

相较于观察者模式,中介者中的对象能够实现相互通信,而观察者只能单方面接受被观察者的通知。

UML

plantuml

复制代码
@startuml
'https://plantuml.com/class-diagram

interface Colleague {
    + send(Object, String) : void
    + receiver(Object) : void
}

class ColleagueA {
    + send(Object, String) : void
    + receiver(Object) : void
}

class ColleagueB {
    + send(Object, String) : void
    + receiver(Object) : void
}

interface Mediator {
    + send(Object, String) : void
    + register(Colleague) : void
}

class ConcreteMediator {
    - colleagues : List<Colleague>
    + send(Object, String) : void
    + register(Colleague) : void
}

Colleague <|.. ColleagueA
Colleague <|.. ColleagueB
Mediator <|.. ConcreteMediator

ConcreteMediator "1" --> "n" Colleague

@enduml

类图

实战代码

模板

Colleague

java 复制代码
public interface Colleague {  
    void send(Object object, String receiver);  
    void receive(Object object);  
}

public class ColleagueA implements Colleague {  
    private String name;
    private Mediator mediator;  
  
    public ColleagueA(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;  
    }  
  
    @Override  
    public void send(Object object, String receiver) {  
        mediator.send(object, receiver);  
    }  
  
    @Override  
    public void receive(Object object) {  
        System.out.println("A" + object);  
    }  
}

public class ColleagueB implements Colleague {
    private String name;
    private Mediator mediator;  
  
    public ColleagueB(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;  
    }  
  
    @Override  
    public void send(Object object, String receiver) {  
        mediator.send(object, receiver);  
    }  
  
    @Override  
    public void receive(Object object) {  
        System.out.println("B" + object);  
    }  
}  

Mediator

java 复制代码
public interface Mediator {  
    void send(Object object, String receiver);  
    void register(Colleague colleague);  
}  

public class ConcreteMediator implements Mediator {  
    private List<Colleague> colleagues = new ArrayList<>();  
  
    @Override  
    public void send(Object object, String receiver) {  
        for (Colleague colleague : colleagues) {  
            if (colleague.getName().equals(receiver)) {
                colleague.receive(object);  
            }  
        }  
    }  
  
    @Override  
    public void register(Colleague colleague) {  
        colleagues.add(colleague);  
    }  
}  

Client

java 复制代码
public class Client {  
    public static void main(String[] args) {  
        // 创建中介者  
        Mediator mediator = new ConcreteMediator();  
          
        // 创建节点并注册到中介者  
        ColleagueA colleagueA = new ColleagueA("A", mediator);  
        ColleagueB colleagueB = new ColleagueB("B", mediator);  
        mediator.register(colleagueA);  
        mediator.register(colleagueB);  
           
        colleagueA.send("Hello", "B");  
    }  
}

中间件

中介者模式的思想在系统架构同样也适用

spring cloud gateway 就是一个中介者,服务间通信都是通过 gateway 来实现

消息队列也是一个中介者

相关推荐
2301_780789667 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设8 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
步行cgn8 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川8 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵8 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David9 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1009 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin10 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
霸道流氓气质10 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain37611 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis