首页 > 其他分享 >技术成神之路:设计模式(十五)中介者模式

技术成神之路:设计模式(十五)中介者模式

时间:2024-09-25 21:50:31浏览次数:11  
标签:String 对象 成神 中介 十五 message 设计模式 public User

介绍

中介者模式(Mediator Pattern)是一种行为型设计模式,用于减少对象之间的复杂通信和依赖。它通过引入一个中介者对象来封装对象之间的交互,从而使得对象之间不直接相互依赖,而是通过中介者进行通信。

1. 定义


中介者模式将对象之间的通信封装到一个中介者对象中,使各对象不再直接引用彼此,从而减少对象之间的耦合度。

2. 主要作用


  • 解耦:降低对象之间的依赖关系。
  • 集中控制:所有交互逻辑都集中在中介者中,便于管理。

3. 解决的问题


  • 对象之间的复杂交互导致系统难以维护和扩展。
  • 对象之间存在大量的直接引用,导致系统耦合度高。
  • 需要集中管理对象之间的交互逻辑。

4. 模式原理


包含角色:

  1. 中介者(Mediator):定义一个接口,用于与各同事对象进行通信。
  2. 具体中介者(ConcreteMediator):实现中介者接口,具体协调各同事对象之间的交互。
  3. 同事类(Colleague):各个相互通信的对象,通过中介者与其他同事对象通信。
  4. 具体同事类(ConcreteColleague):实现同事类接口,与中介者进行交互。

UML类图:

技术成神之路:设计模式(十五)中介者模式_User

示例: 以下是一个简单的聊天室示例

// 中介者接口
interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

// 具体中介者类
class ChatRoom implements ChatMediator {
    private List<User> users;

    public ChatRoom() {
        this.users = new ArrayList<>();
    }

    @Override
    public void addUser(User user) {
        this.users.add(user);
    }
    
    @Override
    public void sendMessage(String message, User user) {
        for (User u : users) {
            // 消息不发送给自己
            if (u != user) {
                u.receive(message);
            }
        }
    }
}

// 同事类
abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

// 具体同事类
class ConcreteUser extends User {

    public ConcreteUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(this.name + " 接收到消息: " + message);
    }
}

客户端代码:创建了一个ChatRoom(具体中介者)和多个用户,通过中介者来进行消息传递。

public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatMediator chatMediator = new ChatRoom();

        User user1 = new ConcreteUser(chatMediator, "Alice");
        User user2 = new ConcreteUser(chatMediator, "Bob");
        User user3 = new ConcreteUser(chatMediator, "Charlie");
        User user4 = new ConcreteUser(chatMediator, "Diana");

        chatMediator.addUser(user1);
        chatMediator.addUser(user2);
        chatMediator.addUser(user3);
        chatMediator.addUser(user4);

        user1.send("Hello, everyone!");
    }
}

打印输出

Alice 发送消息: Hello, everyone!
Bob 接收到消息: Hello, everyone!
Charlie 接收到消息: Hello, everyone!
Diana 接收到消息: Hello, everyone!

中介者模式也不难理解,就是起了一个在中间调节作用,比如你去租房,大多数都是去找中介,而你和其他房东在这里都是具体同事类,是不是一下就清晰了好多。

中介者模式又叫调解者模式主要是因为它的核心功能是调解和协调多个对象之间的交互。中介者作为一个中间层,负责管理对象之间的通信,减少它们之间的直接依赖,从而有效地调解各个对象的关系。这种调解作用使得系统更加灵活,便于后期的维护和扩展。

看到这里,有没有发现它和面向切面编程(AOP)很像,在程序中都是起了一个中间者的作用,哈哈,是有一点像,但它们的功能和逻辑差别还是挺大滴,一个是通过中介者解耦对象间的交互,一个是通过切面解耦横切关注点,这里了解下就行。

5. 优缺点


优点:

  1. 降低耦合度,便于维护。
  2. 中介者集中管理,逻辑清晰。

缺点:

  1. 中介者成为了系统的单点故障。
  2. 可能导致中介者过于复杂,难以管理。

6. 应用场景


UI组件交互:如在聊天应用中,各个组件(消息、用户列表等)通过中介者管理交互。 中介服务:在微服务架构中,各服务通过一个API网关进行通信。 ...

7. 总结


中介者模式通过引入一个中介者对象,将对象之间的复杂通信逻辑封装起来,从而降低对象之间的耦合度,提高系统的可维护性和可扩展性。虽然中介者模式能显著优化对象间的交互,但也需要注意中介者对象的设计,以避免其逻辑过于复杂和成为性能瓶颈。适用于需要集中管理对象交互逻辑的场景,如GUI应用、聊天室系统和工作流管理系统等。

标签:String,对象,成神,中介,十五,message,设计模式,public,User
From: https://blog.51cto.com/xaye/12112314

相关文章

  • 第二十五讲:备库为什么会延迟好几个小时?
    第二十五讲:备库为什么会延迟好几个小时?简概开篇​ 在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因。你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。​ 但是,如果备库执行日志的速度持续低于主......
  • 设计模式之组合模式
    组合模式组合模式是一种结构型设计模式,用于将对象组织成树形结构以表示部分-整体的层次关系。它使得客户端可以统一地处理单个对象和组合对象。核心概念透明性:组合模式通过使组件的接口包含管理子部件的操作(如添加、删除等),提供了透明的操作方式。这意味着客户端无需关心它正......
  • 设计模式——观察者模式
    设计模式——观察者模式1.天气预报应用案例具体需求:气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。需要设计开放型API,便于其他第三方也能接入气象站获取数据。提供温度、气压和湿度的接口测量数据更新时,要能实时的通知......
  • 设计模式_1_单例模式
    单例模式什么是单例设计模式单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。只有一个实例的意思是,在整个应用程序中,只存在该类的一个实例对象,而不是创建多个相同类型的对象。全局访问点的意思是,为了让其他类能够获......
  • 《程序猿之设计模式实战 · 适配器模式》
    ......
  • 设计模式之中介模式(三分钟学会一个设计模式)
    中介模式(Mediator)又称之为调停模式。mediator[ˈmiːdieɪtə(r)]n.调停者;斡旋者;解决纷争的人(或机构);本意就是解决纠纷的中间人它是面向对象六大原则中最少知道原则的一个典型应用。(关于面向对象六大原则,可看前文:https://www.cnblogs.com/jilodream/p/5353512.html)大概意......
  • 设计模式之适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,它允许不兼容的接口之间进行交互。在软件工程中,适配器用于解决两个已有接口之间不匹配的问题,使得原本因接口不兼容而不能一起工作的类可以协同工作。基本概念目标接口(Target):客户期望使用的接口,它定义了客户需要的方法......
  • c#代码介绍23种设计模式_07适配器模式
    目录1、适配器模式2、类的适配器模式实现(ClassAdapterPattern.cs)3、对象的适配器模式实现(ObjectAdapterPattern.cs)4、适配器模式的优缺点4-1.类的适配器模式:4-2.对象的适配器模式5、使用场景6、.NET中适配器模式的实现7、实现思路1、适配器模式在实际的开发......
  • 云设计模式介绍
    云设计模式介绍以及它们如何帮助应对分布式计算的谬误   作为构建分布式系统的软件工程师,我们经常遇到诸如不可靠的网络、延迟问题和安全问题等挑战。"分布式计算的谬误"描述了如果未解决,可能导致系统故障的常见误解。但认识到这些陷阱只是开始。真正的问题是:我们如何有效地克......
  • Qt C++设计模式->组合模式
    组合模式(CompositePattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。组合模式的应用场景组合模式非常适合用于需要处理树形结构的场景,比如文件系......