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

目录

前言

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 来实现

消息队列也是一个中介者

相关推荐
轻刀快马3 分钟前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
折哥的程序人生 · 物流技术专研3 分钟前
Java 23 种设计模式:从踩坑到精通 | 装饰器模式 —— 比继承更灵活的扩展方式,你用过吗?
java·装饰器模式·java面试·结构型模式·java设计模式·javaio·从踩坑到精通
lili001211 分钟前
2026 企业 AI 选型新范式:OpenRouter Fusion 证明多模型融合性价比远超单模型,企业该如何重构技术栈? - 微元算力(weytoken)
java·人工智能·python·重构·ai编程
shushangyun_13 分钟前
汽车服务行业B2B平台+AI解决方案哪家专业:2026年最新测评
java·运维·网络·数据库·人工智能·汽车
A.说学逗唱的Coke16 分钟前
【大模型专题】Spring AI Alibaba × Skill 整合实战:让 AI 真正“会干活
java·人工智能·spring
大黄说说28 分钟前
深入理解 Go 协程 Goroutine:并发编程的核心精髓
java·数据库·python
许彰午1 小时前
38_Java设计模式之装饰器模式
java·设计模式·装饰器模式
折哥的程序人生 · 物流技术专研1 小时前
Java 23 种设计模式:从踩坑到精通 | 组合模式 —— 树形结构处理,部分与整体一视同仁
java·组合模式·java面试·springsecurity·结构型模式·java设计模式·从踩坑到精通
郝学胜-神的一滴1 小时前
完全二叉树与堆底层原理深度剖析 | 手写C++大顶堆实现
java·开发语言·数据结构·c++·python·算法
农民小飞侠1 小时前
[leetcode] 165. Compare Version Numbers
java·算法·leetcode