设计模式:中介者模式

    科技2024-08-15  27

    在软件的开发过程中,这样的中介者模式例子也很多,例如,在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;还有大家常用的 QQ 聊天程序的“中介者”是 QQ 服务器。所有这些,都可以采用“中介者模式”来实现,它将大大降低对象之间的耦合性,提高系统的灵活性

    模式的定义与特点

    中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 中介者模式是一种对象行为型模式,其主要优点如下。

    降低了对象之间的耦合性,使得对象易于独立地被复用。将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

    其主要缺点是:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。

    如果不使用中介者模式当我们多个对象之间进行交互的时候容易形成网状,如果改变某一个可能其他都会随之改变。如下图

     

    使用了中介者模式以后图如下:

     

    贴上一个示例代码:

     

     

    /// <summary> /// 抽象中介者 /// </summary> public abstract class AbstractMediator { public abstract void Register(Colleague colleague); public abstract void Replay(Colleague colleague); } /// <summary> /// 具体中介者类 /// </summary> public class ConcreteMediator : AbstractMediator { private List<Colleague> colleagues = new List<Colleague>(); public override void Register(Colleague colleague) { if (!colleagues.Contains(colleague)) { colleagues.Add(colleague); colleague.SetMediator(this); } } public override void Replay(Colleague colleague) { foreach (Colleague item in colleagues) { if (!item.Equals(colleague)) item.Receive(); } } } /// <summary> /// 抽象同事类 /// </summary> public abstract class Colleague { protected AbstractMediator mediator; public void SetMediator(AbstractMediator mediator) { this.mediator = mediator; } public abstract void Send(); public abstract void Receive(); } /// <summary> /// 具体同事类 /// </summary> public class ColleagueA : Colleague { public override void Receive() { Console.WriteLine("A收到了消息"); } public override void Send() { Console.WriteLine("A发出来消息"); mediator.Replay(this); } } public class ColleagueB : Colleague { public override void Receive() { Console.WriteLine("B收到了消息"); } public override void Send() { Console.WriteLine("B发出了消息"); mediator.Replay(this); } } public class MediatorClient { public void Test() { AbstractMediator abstractMediator = new ConcreteMediator(); Colleague cA, cB; cA = new ColleagueA(); cB = new ColleagueB(); abstractMediator.Register(cA); abstractMediator.Register(cB); cA.Send(); cB.Send(); } }

     

    Processed: 0.010, SQL: 8