一.介绍
中介者模式(Mediator Pattern)。属于行为型模式。用一个中介对象来封装一序列的对象交互。中介者使得各对象之间不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
二.实现
举个例子,用户聊天,A用户发了消息,B用户就能收到。B用户发的消息,A用户可以收到。按照一般的做法,A、B想要交互是需要两个类相互关联,这样A、B两类就会耦合,A类的变化就有可能影响到B类。使用中间者模式,就是在A类和B类的用户类中加个中间者类,A、B的交互通过中间者类处理,这样如果A类变动,会影响到的,也就只有A类和中间者类,减少用户类之间的耦合。
//抽象中介者 public abstract class Mediator { public abstract void Send(string message, Colleague colleague); } //具体中介者 public class ConcreteMediator : Mediator { private ColleagueA a; private ColleagueB b; public void SetColleague(ColleagueA a, ColleagueB b) { this.a = a; this.b = b; } public override void Send(string message, Colleague colleague) { if (colleague == this.a) { b.NotifyB(message); } else { a.NotifyA(message); } } } //抽象用户 public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } public abstract void Send(string message); } //具体用户 public class ColleagueA : Colleague { public ColleagueA(Mediator mediator) : base(mediator) { } public override void Send(string message) { mediator.Send(message, this); } public void NotifyA(string message) { Console.WriteLine($"A get message:{message}"); } } //具体用户 public class ColleagueB : Colleague { public ColleagueB(Mediator mediator) : base(mediator) { } public override void Send(string message) { mediator.Send(message, this); } public void NotifyB(string message) { Console.WriteLine($"B get message:{message}"); } } //调用 public static void Main(string[] args) { ConcreteMediator mediator = new ConcreteMediator(); ColleagueA a = new ColleagueA(mediator); ColleagueB b = new ColleagueB(mediator); mediator.SetColleague(a, b); a.Send("A send a message"); b.Send("B send a message"); }
三.总结
优点:
1.简化了对象之间的关系,将系统中各个对象之间的相互关系进行封装,将各个用户类解耦,使系统变得松耦合。
2.提高系统的灵活性,使得各个用户类对象独立而易于复用。
缺点:
1.中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出了问题,整个系统都是受到严重的影响。
2.新加一个用户类后,不得不修改抽象中介者和具体中介者对象。