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

目录

前言

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

消息队列也是一个中介者

相关推荐
shuair1 小时前
idea 2023.3.7常用插件
java·ide·intellij-idea
小安同学iter1 小时前
使用Maven将Web应用打包并部署到Tomcat服务器运行
java·tomcat·maven
Yvonne9781 小时前
创建三个节点
java·大数据
不会飞的小龙人2 小时前
Kafka消息服务之Java工具类
java·kafka·消息队列·mq
是小崔啊3 小时前
java网络编程02 - HTTP、HTTPS详解
java·网络·http
brevity_souls3 小时前
Spring Boot 内置工具类
java·spring boot
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
shix .4 小时前
什么是tomcat
java·tomcat
java技术小馆4 小时前
Deepseek整合SpringAI
java·spring cloud
天荒地老笑话么4 小时前
Mac安装配置Tomcat 8
java·macos·tomcat