行为型设计模式——中介者模式
用一个中介对象来封装一系列的对象交互,让各对象之间复杂的网状结构,变成简单的星型结构。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用于
①一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
②一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
③想定制一个分布在多个类中的行为,而又不想生成太多的子类。
类图如下

1 internal class Program 2 { 3 static void Main(string[] args) 4 { 5 //创建中介者对象 6 ConcreteMediator mediator = new ConcreteMediator(); 7 //创建同事类对象 8 ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator); 9 ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator); 10 //中介者加入各个同事类,帮助它们交互 11 mediator.SetConcreteColleague1(colleague1); 12 mediator.SetConcreteColleague2(colleague2); 13 14 colleague1.Send("同事你好呀"); 15 colleague2.Send("你好,你好,多多关照"); 16 } 17 }
1 /// <summary> 2 /// 抽象中介者,用来定义传递消息抽象方法 3 /// </summary> 4 internal abstract class Mediator 5 { 6 public abstract void send(string message, Colleague colleague); 7 }
1 /// <summary> 2 /// 抽象同事类 3 /// </summary> 4 internal abstract class Colleague 5 { 6 protected Mediator mediator; 7 8 protected Colleague(Mediator mediator) 9 { 10 this.mediator = mediator; 11 } 12 }
1 /// <summary> 2 /// 具体同事类 3 /// </summary> 4 internal class ConcreteColleague1 : Colleague 5 { 6 public ConcreteColleague1(Mediator mediator) : base(mediator) 7 { 8 } 9 10 public void Send(string message) 11 { 12 mediator.send(message, this); 13 } 14 15 public void Notify(string message) 16 { 17 Console.WriteLine($"同事1收到了消息:{message}"); 18 } 19 }
1 /// <summary> 2 /// 具体同事类 3 /// </summary> 4 internal class ConcreteColleague2 : Colleague 5 { 6 public ConcreteColleague2(Mediator mediator) : base(mediator) 7 { 8 } 9 10 public void Send(string message) 11 { 12 mediator.send(message, this); 13 } 14 15 public void Notify(string message) 16 { 17 Console.WriteLine($"同事2收到了消息:{message}"); 18 } 19 }
1 internal class ConcreteMediator : Mediator 2 { 3 private ConcreteColleague1 _colleague1; 4 private ConcreteColleague2 _colleague2; 5 6 public void SetConcreteColleague1(ConcreteColleague1 colleague1) 7 { 8 this._colleague1 = colleague1; 9 } 10 11 public void SetConcreteColleague2(ConcreteColleague2 colleague2) 12 { 13 this._colleague2 = colleague2; 14 } 15 public override void send(string message, Colleague colleague) 16 { 17 if (colleague == _colleague1) 18 { 19 _colleague2.Notify(message); 20 } 21 else if (colleague == _colleague2) 22 { 23 _colleague1.Notify(message); 24 } 25 } 26 }

浙公网安备 33010602011771号