设计模式-行为型模式:中介者模式

简介: 设计模式-行为型模式:中介者模式

1、简介

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过将对象间的交互行为集中到一个中介对象中,来降低对象间的耦合度,使对象间的通信更加简单。在中介者模式中,各个对象不再直接相互引用,而是通过中介者对象来协调它们的行为。

2、组成部分

中介者模式由以下几个部分组成:

  1. 抽象中介者(Mediator):定义了中介者对象的接口,负责定义对象间的通信协议。
  2. 具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个同事对象之间的交互关系。
  3. 抽象同事类(Colleague):定义了同事对象的接口,负责定义对象间的行为。
  4. 具体同事类(Concrete Colleague):实现了同事接口,负责实现具体的行为。

在中介者模式中,各个同事类不再直接相互引用,而是通过中介者对象来进行通信。当一个同事对象需要与另一个同事对象进行通信时,它并不直接与目标对象通信,而是将请求发送给中介者对象,由中介者对象来处理请求,并将请求转发给目标对象。这样,各个同事对象之间的通信变得更加简单,而且不需要了解彼此的实现细节。

3、优缺点

中介者模式的优点包括:

  1. 降低了对象间的耦合度,使得对象间的通信更加简单。由于中介者对象将对象间的通信集中到一起处理,因此各个对象之间不需要直接相互通信,从而降低了它们之间的耦合度。这使得系统更加灵活,可以更方便地修改、扩展和维护。
  2. 可以减少子类的数量,减少了系统的复杂度。在不使用中介者模式的情况下,多个对象之间的交互可能会相互关联,需要通过建立大量的子类来实现各种不同的交互行为。而使用中介者模式后,各个对象之间的交互将被统一管理,不再需要建立大量的子类,从而减少了系统的复杂度。
  3. 可以更好地控制对象间的交互行为,使得系统更加灵活。由于中介者对象可以统一管理对象间的交互行为,因此可以更方便地控制各个对象之间的交互方式和时机,从而使得系统更加灵活。

中介者模式的缺点包括:

  1. 中介者对象可能变得非常复杂,难以维护和扩展。由于中介者对象需要处理各种不同的交互行为,因此可能会变得非常复杂,难以维护和扩展。此时需要设计合理的中介者对象,使其尽可能简单和易于维护。
  2. 中介者对象会成为系统的瓶颈,影响系统的性能。由于中介者对象需要处理各种不同的交互行为,因此可能会成为系统的瓶颈,影响系统的性能。此时需要设计高效的中介者对象,避免其成为系统的瓶颈。
  3. 中介者模式可能会导致系统变得过于复杂,增加开发和维护的难度。在设计中介者模式时,需要权衡好各个对象之间的关系和交互方式,以及中介者对象的设计和实现方式,否则可能会导致系统变得过于复杂,增加开发和维护的难度。
  4. 中介者模式可能会导致系统扩展困难。在系统运行一段时间后,可能需要增加新的对象或修改原有对象的交互行为,此时需要修改中介者对象的实现方式。如果中介者对象的设计不够灵活,可能会导致系统扩展困难,需要对中介者对象进行大量的修改,甚至重新设计。
  5. 中介者模式可能会隐藏系统的交互细节,降低了系统的透明度。由于中介者对象统一管理对象间的交互行为,可能会隐藏各个对象之间的具体交互细节,降低了系统的透明度。此时需要通过合理的接口设计和文档说明来提高系统的透明度,方便系统的使用和维护。

总的来说,中介者模式适用于对象之间的交互比较复杂、耦合度较高的情况,可以有效地降低对象间的耦合度,提高系统的灵活性和可维护性。但是,在设计中介者模式时需要权衡好各个对象之间的关系和交互方式,以及中介者对象的设计和实现方式,避免引入不必要的复杂度和性能瓶颈。

4、使用场景

中介者模式适用于以下情况:

  1. 对象间的交互比较复杂,存在大量的相互关联和相互依赖,导致对象间的耦合度较高。
  2. 每个对象需要了解其他对象的状态信息,以便在某些情况下进行相应的处理,但这种相互依赖关系使得对象之间的通信比较困难。
  3. 对象间的交互方式和时机经常变化,难以通过继承和重写的方式进行管理和维护。
  4. 系统中存在大量的对象,它们之间的交互方式和时机比较复杂,难以通过简单的方法调用和事件通知来管理和维护。

在这些情况下,使用中介者模式可以有效地降低对象间的耦合度,提高系统的灵活性和可维护性。具体的使用场景包括:

  1. 图形界面应用程序中,各个控件之间的交互很复杂,需要通过中介者来统一管理。
  2. 聊天室等网络应用程序中,用户之间的交互非常频繁,需要通过中介者来管理。
  3. 多人协作编辑系统中,多个用户同时编辑同一文档,需要通过中介者来管理。
  4. 调停系统,如劳资调停、纠纷调停等,需要通过中介者来协调不同的利益关系。
  5. 游戏中,多个角色之间的交互非常复杂,需要通过中介者来管理。

总之,中介者模式适用于对象间的交互比较复杂、耦合度较高的情况,可以有效地降低对象间的耦合度,提高系统的灵活性和可维护性。在实际应用中,需要根据具体的业务需求和系统设计来决定是否采用中介者模式。

5、代码实现

下面我们用 Java 代码实现一个简单的中介者模式示例,以便更好地理解该模式的具体实现方式。

假设我们要实现一个简单的图形界面应用程序,其中包含多个控件,例如按钮、文本框、标签等。这些控件之间存在复杂的交互关系,例如点击按钮可以修改文本框中的文本内容,或者根据文本框中的文本内容来更新标签的显示内容等。为了管理这些控件之间的交互关系,我们使用中介者模式来实现。

首先,我们定义一个中介者接口 Mediator,它包含一个 notify 方法,用于通知中介者有控件的状态发生了变化:

1. public interface Mediator {
2. void notify(Component component, String event);
3. }

其中,component 参数表示发生变化的控件对象,event 参数表示变化的类型。

然后,我们定义一个抽象控件类 Component,它包含一个中介者对象,并提供一个 changed 方法,用于通知中介者控件的状态发生了变化:

1. public abstract class Component {
2. protected Mediator mediator;
3. 
4. public void setMediator(Mediator mediator) {
5. this.mediator = mediator;
6.     }
7. 
8. public void changed(String event) {
9.         mediator.notify(this, event);
10.     }
11. }

其中,setMediator 方法用于设置中介者对象,changed 方法用于通知中介者控件的状态发生了变化。

接下来,我们定义具体控件类,例如 Button、TextBox、Label 等,它们继承自抽象控件类 Component,并实现自己的业务逻辑。例如,我们可以定义一个 Button 类,它在被点击时会通知中介者更新文本框中的文本内容:

1. public class Button extends Component {
2. @Override
3. public void changed(String event) {
4.         mediator.notify(this, event);
5.     }
6. 
7. public void click() {
8.         changed("click");
9.     }
10. }

其中,click 方法表示按钮被点击时的行为,它会调用 changed 方法通知中介者按钮的状态发生了变化。

最后,我们定义一个具体中介者类 ConcreteMediator,它实现了中介者接口,负责控制各个控件之间的交互关系。例如,我们可以定义一个 ConcreteMediator 类,它负责监听按钮的点击事件,并根据按钮的状态更新文本框和标签的显示内容:

1. public class ConcreteMediator implements Mediator {
2. private Button button;
3. private TextBox textBox;
4. private Label label;
5. 
6. public void setButton(Button button) {
7. this.button = button;
8.     }
9. 
10. public void setTextBox(TextBox textBox) {
11. this.textBox = textBox;
12.     }
13. 
14. public void setLabel(Label label) {
15. this.label = label;
16.     }
17. 
18. @Override
19. public void notify(Component component, String event) {
20. if (component == button && event.equals("click")) {
21. String text = textBox.getText();
22.             label.setText("Hello " + text + "!");
23.         } else if (component == textBox && event.equals("change")) {
24. String text = textBox.getText();
25.             label.setText("Hello " + text + "!");
26.         }
27.     }
28. }

在 ConcreteMediator 类中,我们通过判断事件类型来实现控件之间的交互逻辑。例如,如果按钮被点击了,我们可以根据文本框中的文本内容更新标签的显示内容

在 ConcreteMediator 类中,我们通过判断事件类型来实现控件之间的交互逻辑。例如,如果按钮被点击了,我们可以根据文本框中的文本内容更新标签的显示内容

1. public class Main {
2. public static void main(String[] args) {
3. ConcreteMediator mediator = new ConcreteMediator();
4. Button button = new Button();
5. TextBox textBox = new TextBox();
6. Label label = new Label();
7. 
8.         mediator.setButton(button);
9.         mediator.setTextBox(textBox);
10.         mediator.setLabel(label);
11. 
12.         button.setMediator(mediator);
13.         textBox.setMediator(mediator);
14.         label.setMediator(mediator);
15. 
16.         button.click();
17.         textBox.setText("World");
18.     }
19. }

运行上述代码,可以看到控制台输出了以下结果:

       Hello !

       Hello World!

这表明按钮被点击时,中介者更新了标签的显示内容;当文本框的内容发生变化时,中介者也更新了标签的显示内容。

总之,中介者模式是一种有效的设计模式,它可以帮助我们更好地管理多个对象之间的交互关系,从而提高代码的可维护性和可扩展性。

相关文章
|
9月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
369 16
|
9月前
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
349 16
|
9月前
|
设计模式 存储 Java
【设计模式】【行为型模式】备忘录模式(Memento)
一、入门 什么是备忘录模式? 备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作
305 8
|
9月前
|
设计模式 消息中间件 Java
【设计模式】【行为型模式】命令模式(Command)
一、入门 什么是命令模式? 命令模式是一种行为设计模式,它将请求或操作封装为对象,从而使你可以用不同的请求对客户进行参数化,并支持请求的排队、记录、撤销等操作。 命令模式的核心是将“请求”封装为独立的
275 15
|
9月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
199 14
|
9月前
|
设计模式 数据采集 算法
【设计模式】【行为型模式】模板方法模式(Template Method)
一、入门 1.1、什么是模板方法模式? 模板模式(Template Method Pattern)是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
295 13
|
9月前
|
设计模式 Java 编译器
【设计模式】【行为型模式】解释器模式(Interpreter)
一、入门 什么是解释器模式? 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义语言的语法表示,并提供一个解释器来处理该语法。它通常用于需要解释和执行特定语言或表达式的场
221 11
|
9月前
|
设计模式 存储 JavaScript
【设计模式】【行为型模式】迭代器模式(Iterator)
一、入门 什么是迭代器模式? 迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种顺序访问聚合对象中元素的方法,而不需要暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出
252 11
|
9月前
|
设计模式 XML JSON
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
294 10
|
9月前
|
设计模式 Java 程序员
【设计模式】【行为型模式】中介者模式(Mediator)
一、入门 什么是中介者模式? 中介者模式(Mediator Pattern)是一种行为设计模式,旨在减少对象之间的直接依赖,通过引入一个中介者对象来协调多个对象之间的交互。这种模式特别适用于对象间存在
229 9