软件设计模式系列之十九——中介者模式

软件设计,模式,系列,十九,中介 · 浏览次数 : 10

小编点评

**中介者模式** **定义:** 中介者模式是一种行为型设计模式,用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。中介者模式有助于减少对象之间的耦合性,使系统更加可维护和扩展。 **结构:** 中介者模式的结构包括以下几个关键元素: * **抽象中介者(Mediator):**定义了中介者模式的核心接口,包含方法来注册组件、发送消息等操作。 * **具体中介者(ConcreteMediator):**实现抽象中介者接口,管理所有具体组件对象的引用,并负责协调它们之间的通信。 * **抽象组件(Colleague):**抽象组件代表参与中介者模式的各个组件对象,它们通常具有一个指向中介者的引用,并定义了与其他组件对象通信的接口。 * **具体组件(ConcreteColleague):**实现抽象组件接口,确保它们能够通过中介者对象进行通信。 **实现步骤:** 1. 定义抽象中介者接口。 2. 创建具体中介者类,实现抽象中介者接口。 3. 定义抽象组件接口。 4. 创建具体组件类,实现抽象组件接口。 5. 在具体组件中使用中介者来发送消息,而不是直接与其他组件通信。 **代码实现:** ```java // 1. 定义抽象中介者接口 interface Mediator { void register(Colleague colleague); void send(String message, Colleague sender); } // 2. 创建具体中介者类,实现抽象中介者接口 class ConcreteMediator implements Mediator { private List colleagues; public ConcreteMediator() { this.colleagues = new ArrayList<>(); } @Override public void register(Colleague colleague) { this.colleagues.add(colleague); } @Override public void send(String message, Colleague sender) { for (Colleague colleague : this.colleagues) { colleague.receive(message, sender); } } } // 3. 定义抽象组件接口 interface Colleague { void receive(String message, Colleague sender); } // 4. 创建具体组件类,实现抽象组件接口 class ConcreteColleague implements Colleague { private String message; public ConcreteColleague(String message) { this.message = message; } @Override public void receive(String message, Colleague sender) { System.out.println("收到消息:" + message); } } ``` **典型应用场景:** * 多对多对象交互 * 降低对象之间的耦合性 * 提高系统的可维护性和可扩展性 **优缺点:** **优点:** *降低对象之间的耦合性 * 易于扩展 * 集中控制 **缺点:** * 中介者对象可能变得复杂 * 性能问题

正文

@

1 模式的定义

中介者模式是一种行为型设计模式,它用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。这种模式有助于减少对象之间的耦合性,使系统更加可维护和扩展。中介者模式是Gang of Four(GoF)设计模式中的一员,旨在促进对象之间的松耦合关系,从而提高系统的灵活性。

2 举例说明

为了更好地理解中介者模式,让我们考虑一个简单的例子:一个多人在线聊天室应用程序。在这个应用程序中,有多个用户可以发送消息给其他用户,而不需要直接知道接收消息的用户是谁。中介者模式可以用来管理用户之间的消息传递。

在这个例子中,中介者充当聊天室的中心,所有用户都将消息发送到中介者,然后中介者负责将消息传递给适当的接收者。这样,用户之间不需要直接通信,而是通过中介者进行通信,从而降低了用户之间的耦合性。

3 结构

中介者模式的结构包括以下几个关键元素:

抽象中介者(Mediator):这是中介者模式的核心接口,它定义了中介者对象应该具备的方法,通常包括注册组件、发送消息等操作。

具体中介者(ConcreteMediator):具体中介者是抽象中介者的实现,它维护了对所有相关组件的引用,并负责协调它们之间的通信。

抽象组件(Colleague):抽象组件代表参与中介者模式的各个组件对象,它们通常具有一个指向中介者的引用,并定义了与其他组件对象通信的接口。

具体组件(ConcreteColleague):具体组件是抽象组件的实现,它们之间通过中介者来通信,而不是直接相互关联。

4 实现步骤

要实现中介者模式,您可以按照以下步骤进行:

定义抽象中介者接口:创建一个抽象中介者接口,其中包括方法来注册和发送消息。

创建具体中介者类:实现抽象中介者接口,管理所有具体组件对象的引用,并协调它们之间的通信。

定义抽象组件接口:创建一个抽象组件接口,其中包括方法来注册中介者和发送消息。

创建具体组件类:实现抽象组件接口,确保它们能够通过中介者对象进行通信。

在具体组件中使用中介者:在具体组件中使用中介者来发送消息,而不是直接与其他组件通信。

客户端代码:在客户端代码中创建中介者和组件对象,然后将组件对象注册到中介者中,以便它们可以相互通信。

5 代码实现

// 1. 定义抽象中介者接口
interface Mediator {
    void register(Colleague colleague);
    void send(String message, Colleague sender);
}

// 2. 创建具体中介者类
class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void register(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void send(String message, Colleague sender) {
        for (Colleague colleague : colleagues) {
            if (colleague != sender) {
                colleague.receive(message);
            }
        }
    }
}

// 3. 定义抽象组件接口
interface Colleague {
    void setMediator(Mediator mediator);
    void send(String message);
    void receive(String message);
}

// 4. 创建具体组件类
class ConcreteColleague implements Colleague {
    private Mediator mediator;
    private String name;

    public ConcreteColleague(String name) {
        this.name = name;
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void send(String message) {
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(name + " received: " + message);
    }
}

// 6. 客户端代码
public class Client {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        Colleague colleague1 = new ConcreteColleague("User1");
        Colleague colleague2 = new ConcreteColleague("User2");
        Colleague colleague3 = new ConcreteColleague("User3");

        mediator.register(colleague1);
        mediator.register(colleague2);
        mediator.register(colleague3);

        colleague1.setMediator(mediator);
        colleague2.setMediator(mediator);
        colleague3.setMediator(mediator);

        colleague1.send("Hello, everyone!");
        colleague2.send("Hi there!");
    }
}

6 典型应用场景

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

多对多对象交互:当多个对象之间需要进行复杂的相互通信时,中介者模式可以帮助简化系统结构。

减少耦合性:当对象之间的直接耦合关系导致系统难以维护和扩展时,中介者模式可以降低对象之间的耦合度。

分布式系统:在分布式系统中,各个节点之间可能需要进行协同工作,中介者模式可以用于管理节点之间的通信。

7 优缺点

优点:

降低耦合性:中介者模式将对象之间的通信集中在一个中介者对象中,降低了对象之间的直接耦合,使系统更加灵活。

易于扩展:通过添加新的具体组件和中介者,可以轻松扩展系统,而无需修改现有代码。

集中控制:中介者模式允许将系统的控制逻辑集中在一个对象中,使系统更易于理解和维护。

缺点:

中介者对象复杂:随着系统的增长,中介者对象可能会变得复杂,包含大量的逻辑。

性能问题:由于中介者负责协调对象之间的通信,可能会导致性能问题,特别是在大规模系统中。

8 类似模式

与中介者模式类似的模式包括观察者模式和代理模式。虽然它们在某些方面具有相似性,但它们在用途和实现方式上有一些关键区别。

观察者模式(Observer Pattern):

观察者模式和中介者模式都处理对象之间的通信,但它们关注的侧重点不同。观察者模式是一对多的关系,其中一个主题对象(Subject)维护一组观察者(Observer),当主题对象的状态发生变化时,通知所有观察者。观察者之间通常不直接通信,而是通过主题对象。中介者模式关注多对多的对象通信,中介者充当对象之间的中心枢纽,协调它们的交互。观察者模式关注一对多的依赖关系,其中主题对象维护观察者列表,但观察者之间不直接通信,而是通过主题对象。

代理模式(Proxy Pattern):

代理模式和中介者模式都涉及到控制对象之间的访问和交互。代理充当目标对象的代表,可以控制对目标对象的访问。中介者模式关注多个对象之间的通信和协调,它引入一个中介者对象,使对象之间的关系更加松散。代理模式关注对单个对象的访问控制,代理对象通常封装了目标对象的功能,但并不协调多个对象之间的交互。

虽然这些模式都有助于降低对象之间的耦合性,但它们的关注点和应用场景略有不同。中介者模式用于协调多个对象之间的复杂通信,观察者模式用于建立一对多的依赖关系,代理模式用于控制对单个对象的访问,而发布-订阅模式用于发布和订阅事件或消息。选择哪种模式取决于具体的设计需求和问题背景。

9 小结

中介者模式是一种有助于管理多个对象之间通信的强大工具。通过引入中介者对象,它能够降低对象之间的耦合度,使系统更加灵活、易于扩展和维护。在设计软件系统时,考虑使用中介者模式来促进对象之间的松耦合关系,提高系统的可维护性和可扩展性。

与软件设计模式系列之十九——中介者模式相似的内容:

软件设计模式系列之十九——中介者模式

@目录1 模式的定义2 举例说明3 结构4 实现步骤5 代码实现6 典型应用场景7 优缺点8 类似模式9 小结 1 模式的定义 中介者模式是一种行为型设计模式,它用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。这种模式有助于减少对象之间的耦合性,使系统更加可维护和扩展。中介者

软件设计模式系列之十一——装饰模式

装饰模式属于结构型设计模式,它通过将对象包装在装饰器类中来动态地添加额外的行为,而不需要修改原始对象的代码。这个模式以透明的方式向对象添加功能,从而使您可以根据需要组合各种功能。

软件设计模式系列之十二——外观模式

外观模式是一种结构型设计模式,它提供了一个简化的接口,用于访问系统中的一组相关接口,以隐藏系统的复杂性。外观模式的主要目标是简化客户端与子系统之间的交互,同时降低了系统的耦合度。它允许客户端通过一个统一的入口点来与系统进行通信,而不需要了解系统内部的具体细节和复杂性

软件设计模式系列之十八——迭代器模式

迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。

软件设计模式系列之十七——解释器模式

解释器模式是一种行为型设计模式,它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则,并使用解释器来解释和执行这些规则,将复杂的语言转换为对象的操作。 在软件开发中,解释器模式常用于处理类似于编程语言、查询语言、正则表达式等需要解释和执行的场景。它将一个复杂的语言分解为一系列简单的规则,...

软件设计模式系列之十五——职责链模式

职责链模式(Chain of Responsibility Pattern)也称为责任链模式,是一种结构型设计模式,用于构建一条对象处理请求的责任链。在这个模式中,多个对象依次处理请求,直到其中一个对象能够处理该请求为止。职责链模式将请求的发送者和接收者解耦,允许多个对象都有机会处理请求,同时可以动...

软件设计模式系列之二十四——模板方法模式

在软件设计领域,设计模式是一组被反复使用、多次实践验证的经典问题解决方案。其中,模板方法模式是一种行为型设计模式,用于定义一个算法的骨架,将算法中的某些步骤延迟到子类中实现,从而使子类可以重新定义算法的某些特定步骤,同时保持算法的整体结构不变。本文将深入探讨模板方法模式,包括其定义、举例、结构、实现...

软件设计模式系列之二十三——策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态选择算法的行为。这意味着你可以定义一系列算法,将它们封装成独立的策略对象,然后根据需要在不修改客户端代码的情况下切换这些算法。策略模式有助于解决问题领域中不同行为的变化和扩展,同时保持代码的灵活性和可维护性。

软件设计模式系列之十三——享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少内存占用或计算开销,通过共享大量细粒度对象来提高系统的性能。这种模式适用于存在大量相似对象实例,但它们的状态可以外部化(extrinsic),并且可以在多个对象之间共享的情况。

软件设计模式系列之十四——代理模式

代理模式是一种结构型设计模式,它允许一个对象(代理)充当另一个对象的接口,以控制对该对象的访问。代理模式通常用于控制对真实对象的访问,以实现一些额外的功能,例如延迟加载、权限控制、日志记录等。这种模式属于结构型设计模式,因为它关注对象之间的组合,以形成更大的结构。