2023-03-25
设计模式
00
请注意,本文编写于 391 天前,最后修改于 391 天前,其中某些信息可能已经过时。

目录

引言
抽象中介者
抽象同事类
具体同事类
具体中介者类
总结

引言

中介者模式是一种行为型设计模式,它用于减少对象之间的直接耦合,从而更好地维护代码的可扩展性和可维护性。

在中介者模式中,一个中介者对象封装了一组对象之间的交互逻辑,这些对象通常都有相互关联,但是彼此之间并不直接交互。中介者对象负责协调对象之间的通信,将对象之间的通信逻辑封装在中介者对象中,从而避免对象之间的直接耦合。

中介者模式中有以下几个主要角色:

  • 抽象中介者(Mediator):定义了同事对象之间交互的接口,它通常是一个接口或者抽象类,其中声明了同事对象之间交互所需要的方法。抽象中介者可以用来集中处理同事对象之间的通信,降低系统的耦合度。

  • 具体中介者(ConcreteMediator):实现了抽象中介者接口,通常包含了一个集合用来存储同事对象,实现同事对象之间的协作。具体中介者需要知道所有具体同事类,并从具体同事对象接收消息,向其他具体同事对象发出命令。

  • 抽象同事类(Colleague):定义了同事对象的接口,可以是一个抽象类或者接口,其中定义了一些公共的方法和属性。抽象同事类通常持有一个抽象中介者的引用,以便能够将自己的状态变化通知中介者,同时也可以接收中介者发送的消息。

  • 具体同事类(ConcreteColleague):实现了抽象同事类的接口,是实际的参与者,每个具体同事类都需要知道它的中介者对象,并与其进行交互。具体同事类之间的通信都是通过具体中介者来实现的,它们之间不直接交互。

下面使用C#实现简答中介者模式:

抽象中介者

创建抽象中介者接口Mediator,该接口声明了一个方法Send用于发送消息:

csharp
public interface Mediator { void Send(string message, Colleague colleague); }

抽象同事类

创建抽象同事类Colleague,该类声明了一个中介者对象,用于与其他同事类交互:

csharp
public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } public abstract void Send(string message); public abstract void Notify(string message); }

具体同事类

创建具体同事类ConcreteColleagueA和ConcreteColleagueB,它们实现了抽象同事类Colleague,并实现了发送消息和接收消息的方法:

csharp
public class ConcreteColleagueA : Colleague { public ConcreteColleagueA(Mediator mediator) : base(mediator) { } public override void Send(string message) { mediator.Send(message, this); } public override void Notify(string message) { Console.WriteLine("ColleagueA received message: " + message); } } public class ConcreteColleagueB : Colleague { public ConcreteColleagueB(Mediator mediator) : base(mediator) { } public override void Send(string message) { mediator.Send(message, this); } public override void Notify(string message) { Console.WriteLine("ColleagueB received message: " + message); } }

具体中介者类

创建具体中介者类ConcreteMediator,该类实现了抽象中介者接口Mediator,并维护了一组同事类对象:

csharp
public class ConcreteMediator : Mediator { private ConcreteColleagueA colleagueA; private ConcreteColleagueB colleagueB; public ConcreteColleagueA ColleagueA { set { colleagueA = value; } } public ConcreteColleagueB ColleagueB { set { colleagueB = value; } } public void Send(string message, Colleague colleague) { if (colleague == colleagueA) { colleagueB.Notify(message); } else { colleagueA.Notify(message); } } }

可以这样调用:

csharp
ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator); ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator); mediator.ColleagueA = colleagueA; mediator.ColleagueB = colleagueB; colleagueA.Send("Hello, ColleagueB."); colleagueB.Send("Hello, ColleagueA.");

输出:

csharp
ColleagueB received message: Hello, ColleagueB. ColleagueA received message: Hello, ColleagueA.

在这个例子中,ConcreteMediator充当了中介者的角色,ConcreteColleagueAConcreteColleagueB充当了同事类的角色。当ConcreteColleagueA发送消息时,ConcreteMediator将消息转发给ConcreteColleagueBConcreteColleagueB将接收到消息并打印在控制台上。当ConcreteColleagueB发送消息时,ConcreteMediator将消息转发给ConcreteColleagueAConcreteColleagueA将接收到消息并打印在控制台上。这样,ConcreteColleagueAConcreteColleagueB就不需要直接交互,而是通过ConcreteMediator来协调它们之间的通信。

总结

在中介者模式中,抽象中介者和抽象同事类是抽象层,而具体中介者和具体同事类是实现层。中介者模式通过将对象之间的通信交给中介者来实现松耦合,从而提高系统的可维护性和可扩展性。

本文作者:Peter.Pan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!