Mediator
中介者模式:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,其可以改变他们之间的交互。
中介者模式又被称为 调停模式 ,它是 迪米特法则 的典型应用
在实现生活中也有很多的中介,比如房屋中介、婚姻介绍所等等。下面我们以婚姻中介为例来看下中介者模式。在没有婚姻中介之前,两个人从认识到恋爱完全看缘分,大千世界,相识相知很不容易,因为这就是一个多对多的选择过程,可以用图表示如下:
上图之间表示两个人之间的关系,可以看出来是十分混乱,而且随着节点增多,将会越来越复杂,一个节点和一个节点并不能保证直接认识,因为选老婆这个事中间还是不能通过太多的人。 当婚姻中介所出现后,上面的情况变成了如下:
人们全部通过中介来和对方认识,整个关系一下子就变得很清晰,不再那么杂乱无章,这就是解耦后的效果(每个人都能通过中介人事对方,岂不机会更大)。其实对应上图的形状,其实我个人很喜欢把它叫做中心开花模式
在程序中使用中介者模式也是为了达到解耦的效果,其对应的UML图如下:
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个集合来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
对于婚姻中介来说,也并不是每个人都能这样去相亲。因为至少你得在中介所登记下。这样人家才有你的联系方式,有结果了才能通知你。同样你药中介的联系方式,才能随时知道结果,以及通过中介去联系对方人员。这在中介者模式当中是一样的:中介者和同事都会互相持有对方引用。
1、场景描述
2、实现
/// <summary>/// 抽象中介者/// </summary>public abstract class AbstractMediator{/// <summary>/// 注册人员/// </summary>/// <param name="colleague"></param>public abstract void Register(AbstractColleague colleague);/// <summary>/// 介绍给对方认识,转发请求/// </summary>/// <param name="colleagueTo">对方人员编号</param>public abstract void Introduce(string code);}/// <summary>/// 具体中介角色-婚姻介绍所/// </summary>public class MarriageMediator : AbstractMediator{private List<AbstractColleague> colleagues = new();/// <summary>/// 婚介所介绍/// </summary>/// <param name="code">人员编号</param>public override void Introduce(string code){Console.WriteLine("婚介所开始连线搭桥...");colleagues.FirstOrDefault(it => it.Code == code)?.Reveive();}/// <summary>/// 注册相亲人员/// </summary>/// <param name="colleague"></param>public override void Register(AbstractColleague colleague){// 注册进婚介所colleagues.Add(colleague);// 将婚介所聚合赋值到具体人员(相当于现实中将婚介所的联系方式给到注册人)colleague.SetMediator(this);}}/// <summary>/// 抽象同事类/// </summary>public abstract class AbstractColleague{// 聚合中介者角色public AbstractMediator _mediator;// 人员编号,唯一public string Code { get; }public AbstractColleague(string code){Code = code;}/// <summary>/// 设置中介者/// </summary>/// <param name="mediator"></param>public void SetMediator(AbstractMediator mediator){_mediator = mediator;}/// <summary>/// 接收到认识邀请/// </summary>public abstract void Reveive();/// <summary>/// 发送认识邀请/// </summary>public abstract void Send();}/// <summary>/// 具体同事类角色 -- 张三/// </summary>public class User1Colleague : AbstractColleague{public User1Colleague(string code) : base(code){}/// <summary>/// 收到消息/// </summary>public override void Reveive(){Console.WriteLine("张三收到认识邀请...");}public override void Send(){Console.WriteLine("张三看上了一个人,发出认识邀请...");_mediator.Introduce("200");}}/// <summary>/// 具体同事类角色 -- 张三/// </summary>public class User2Colleague : AbstractColleague{public User2Colleague(string code) : base(code){}/// <summary>/// 收到消息/// </summary>public override void Reveive(){Console.WriteLine("李四收到认识邀请...");}public override void Send(){Console.WriteLine("李四看上了一个人,发出认识邀请...");_mediator.Introduce("100");}}// 客户端AbstractColleague colleague1 = new User1Colleague("100");AbstractColleague colleague2 = new User2Colleague("200");AbstractMediator mediator = new MarriageMediator();mediator.Register(colleague1);mediator.Register(colleague2);colleague1.Send();Console.WriteLine("***************************");colleague2.Send();
3、优缺点
优点:
- 解耦
- 符合迪米特法则,对象之间保持最少的了解
缺点:
