/* 20221225
中介模式
对于多个已经封装好的对象,若需要他们彼此间直接通信。则可以使用一个中介对象,统一接收、发送
消息。但缺点是中介对象会比较复杂
*/
using System;
using System.Collections.Generic;
namespace DesignModeApp.中介模式
{
internal class Program
{
public static void Run()
{
BaseColleague colleague1 = new ConcreteColleague1("张三");
BaseColleague colleague2 = new ConcreteColleague2("李四");
BaseColleague colleague3 = new ConcreteColleague3("王麻子");
BaseMediator mediator = new Mediator();
mediator.AddColleague(colleague1);
mediator.AddColleague(colleague2);
mediator.AddColleague(colleague3);
colleague1.SetMediator(mediator);
colleague2.SetMediator(mediator);
colleague3.SetMediator(mediator);
colleague1.SendMessage("下午茶来了");
Console.WriteLine("==============================================");
colleague2.SendMessage("黄扒皮来了");
}
}
public abstract class BaseColleague
{
private readonly string _name;
public BaseColleague(string name)
{
_name = name;
}
private BaseMediator _baseMediator;
public void SetMediator(BaseMediator baseMediator)
{
_baseMediator = baseMediator;
}
public void SendMessage(string meg)
{
_baseMediator.Send(_name + "发送消息:" + meg, this);
}
public void Notify(string meg)
{
Console.WriteLine(_name + "收到消息:" + meg);
}
}
public abstract class BaseMediator
{
private readonly List<BaseColleague> colleaguesList = new List<BaseColleague>();
public void AddColleague(BaseColleague colleague)
{
colleaguesList.Add(colleague);
}
public void Send(string meg, BaseColleague baseColleague)
{
foreach (BaseColleague item in colleaguesList)
{
if (item != baseColleague)
{
item.Notify(meg);
}
}
}
}
public class Mediator : BaseMediator
{
}
public class ConcreteColleague1 : BaseColleague
{
public ConcreteColleague1(string name)
: base(name)
{ }
}
public class ConcreteColleague2 : BaseColleague
{
public ConcreteColleague2(string name)
: base(name)
{ }
}
public class ConcreteColleague3 : BaseColleague
{
public ConcreteColleague3(string name)
: base(name)
{ }
}
}