行为型设计模式——中介者模式

用一个中介对象来封装一系列的对象交互,让各对象之间复杂的网状结构,变成简单的星型结构。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

适用于

①一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。

②一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。

③想定制一个分布在多个类中的行为,而又不想生成太多的子类。

类图如下

 

 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     }
View Code
1     /// <summary>
2     /// 抽象中介者,用来定义传递消息抽象方法
3     /// </summary>
4     internal abstract class Mediator
5     {
6         public abstract void send(string message, Colleague colleague);
7     }
View Code
 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     }
View Code
 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     }
View Code
 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     }
View Code
 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     }
View Code

 

posted @ 2025-04-24 21:57  是铭不是明  阅读(9)  评论(0)    收藏  举报