设计模式之中介者模式

中介者模式(Mediator Pattern)是一种对象行为型模式,主要用于降低系统中对象之间的耦合度,通过引入一个中介者来封装对象之间的交互,使得对象之间的交互更加灵活和可扩展。以下是中介者模式的详细介绍:

一、定义与原理

定义:中介者模式定义了一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,是迪米特法则(最少知识原则)的典型应用。

原理:在中介者模式中,各个对象不再直接相互引用和通信,而是通过中介者来进行间接通信。中介者负责协调各个对象之间的交互,降低了对象之间的耦合性,提高了系统的灵活性和可维护性。

二、主要角色及类图

中介者模式类图:

主要角色:

  • 抽象中介者(Mediator):定义了中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者(ConcreteMediator):实现中介者接口,定义一个集合来管理同事对象,协调各个同事角色之间的交互关系。
  • 抽象同事类(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

三、优点

  1. 降低了对象之间的耦合性:通过引入中介者,使得对象之间的直接依赖关系转变为对中介者的依赖,降低了对象之间的耦合性。
  2. 提高了系统的灵活性:由于对象之间的交互被封装在中介者中,因此可以独立地改变对象之间的交互方式,而不需要修改对象本身的代码。
  3. 易于维护和扩展:由于对象之间的交互被中介者所管理,因此当需要增加新的交互或修改现有交互时,只需要修改中介者的代码即可,降低了系统的维护成本和扩展难度。

四、缺点

  1. 中介者可能会变得复杂:当同事类数量较多时,中介者需要处理大量的交互逻辑,可能会导致中介者的代码变得复杂和难以维护。
  2. 中介者可能成为系统的瓶颈:由于所有的交互都需要通过中介者来进行,因此中介者的性能可能会成为系统的瓶颈。

五、应用场景

中介者模式适用于以下场景:

  1. 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

例如,在聊天室系统中,可以使用中介者模式来管理用户之间的通信;在航空管制系统中,可以使用中介者模式来管理飞机之间的通信;在MVC框架中,控制器(Controller)可以作为模型(Model)和视图(View)之间的中介者等。

六、实现例子

下面是一个简单的Java示例,模拟了一个聊天室场景,其中有多名用户(User)通过聊天室(ChatRoom,即中介者)进行通信。

首先,定义中介者接口:

java 复制代码
public interface Mediator {  
    void sendMessage(String from, String to, String message);  
    void broadcastMessage(String from, String message);  
}

然后,实现中介者类(ChatRoom):

java 复制代码
import java.util.ArrayList;  
import java.util.List;  
  
public class ChatRoom implements Mediator { 
    //这里用list,生产环境用map效率更高,这里仅做演示用
    private List<User> users = new ArrayList<>();  
  
    @Override  
    public void sendMessage(String from, String to, String message) {  
        for (User user : users) {  
            if (user.getName().equals(to)) {  
                user.receiveMessage(from, message);  
                break;  
            }  
        }  
    }  
  
    @Override  
    public void broadcastMessage(String from, String message) {  
        for (User user : users) {  
            if (!user.getName().equals(from)) {  
                user.receiveMessage(from, message);  
            }  
        }  
    }  
  
    public void registerUser(User user) {  
        users.add(user);  
        user.setMediator(this);  
    }  
}

接下来,定义用户类(User),它依赖于中介者进行通信:

java 复制代码
public class User {  
    private String name;  
    private Mediator mediator;  
  
    public User(String name) {  
        this.name = name;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setMediator(Mediator mediator) {  
        this.mediator = mediator;  
    }  
  
    public void sendMessage(String to, String message) {  
        mediator.sendMessage(this.name, to, message);  
    }  
  
    public void broadcastMessage(String message) {  
        mediator.broadcastMessage(this.name, message);  
    }  
  
    public void receiveMessage(String from, String message) {  
        System.out.println(from + " says to " + this.name + ": " + message);  
    }  
}

最后,是客户端代码,用于演示如何使用这个中介者模式:

java 复制代码
public class Client {  
    public static void main(String[] args) {  
        ChatRoom chatRoom = new ChatRoom();  
  
        User alice = new User("Alice");  
        User bob = new User("Bob");  
        User charlie = new User("Charlie");  
  
        chatRoom.registerUser(alice);  
        chatRoom.registerUser(bob);  
        chatRoom.registerUser(charlie);  
  
        alice.sendMessage("Bob", "Hello Bob!");  
        charlie.broadcastMessage("Hello everyone!");  
    }  
}

在这个例子中,ChatRoom 是中介者,负责用户之间的消息传递。用户(User)通过中介者(ChatRoom)来发送和接收消息,而不需要直接与其他用户交互,从而降低了类之间的耦合度。

七、总结

中介者模式是一种有效的设计模式,它通过引入中介者来封装对象之间的交互,降低了对象之间的耦合性,提高了系统的灵活性和可维护性。然而,在使用中介者模式时也需要注意其潜在的缺点,并根据实际情况选择合适的应用场景。

如果中介者模式对你有用,记得点赞收藏。

相关推荐
思忖小下2 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
liyinuo20174 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
aaasssdddd966 小时前
C++的封装(十四):《设计模式》这本书
数据结构·c++·设计模式
T1an-16 小时前
设计模式之【观察者模式】
观察者模式·设计模式
思忖小下8 小时前
梳理你的思路(从OOP到架构设计)_设计模式Factory Method模式
设计模式·工厂方法模式·eit
霁月风9 小时前
设计模式——工厂方法模式
c++·设计模式·工厂方法模式
发飙的蜗牛'11 小时前
23种设计模式
android·java·设计模式
NorthCastle21 小时前
设计模式-创建型模式-简单工厂模式详解
设计模式·简单工厂模式
越甲八千1 天前
重拾设计模式-外观模式和适配器模式的异同
设计模式·适配器模式·外观模式
越甲八千1 天前
重拾设计模式--适配器模式
设计模式·适配器模式