以推送消息为例:
- UML图:
- 代码实现:
public abstract class BaseMessager
{
public string Name { get; set; }
public abstract void SendMessage(string message, BaseMessager messageTo);
public abstract void GetMessage(string message, BaseMessager messageFrom);
}
/// <summary>
/// 管理员推送消息
/// </summary>
public class MasterMessager : BaseMessager
{
public override void GetMessage(string message, BaseMessager messageFrom)
{
Console.WriteLine("{0}管理员get{1}:{2}", base.Name, messageFrom.Name, message);
}
public override void SendMessage(string message, BaseMessager messageTo)
{
Console.WriteLine("{0}管理员to {1}:{2}", base.Name, messageTo.Name, message);
messageTo.GetMessage(message, this);
}
}
/// <summary>
/// 普通用户推送消息
/// </summary>
public class UserMessager : BaseMessager
{
public override void GetMessage(string message, BaseMessager messageFrom)
{
Console.WriteLine("{0}用户get{1}:{2}", base.Name, messageFrom.Name, message);
}
public override void SendMessage(string message, BaseMessager messageTo)
{
Console.WriteLine("{0}用户to {1}:{2}", base.Name, messageTo.Name, message);
messageTo.GetMessage(message, this);
}
}
/// <summary>
/// 系统推送消息
/// </summary>
public class SystemMessager : BaseMessager
{
public override void GetMessage(string message, BaseMessager messageFrom)
{
Console.WriteLine("系统无需接受信息");
}
public override void SendMessage(string message, BaseMessager messageTo)
{
Console.WriteLine("{0}系统to {1}:{2}", base.Name, messageTo.Name, message);
messageTo.GetMessage(message, this);
}
}
public class Mediator
{
private List<BaseMessager> _messagers = new List<BaseMessager>();
/// <summary>
/// 加入人员
/// </summary>
/// <param name="baseMessager">人员</param>
public void AddMessager(BaseMessager baseMessager)
{
this._messagers.Add(baseMessager);
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="message">消息内容</param>
/// <param name="messgaeFrom">发送消息的人</param>
public void SendMessage(string message, BaseMessager messgaeFrom)
{
Console.WriteLine("{0}Send:{1}", messgaeFrom.Name, message);
foreach (var item in this._messagers)
{
if (item.Name == messgaeFrom.Name)
{
continue;
}
item.GetMessage(message, messgaeFrom);
}
}
}
- 调用端代码:
class Program
{
static void Main(string[] args)
{
var _mediator = new Mediator();
var master = new MasterMessager
{
Name = "管理员A"
};
var aiSystem = new SystemMessager
{
Name = "AI系统"
};
var zs_User = new UserMessager
{
Name = "张三"
};
var ls_User = new UserMessager
{
Name = "李四"
};
_mediator.AddMessager(master);
_mediator.AddMessager(aiSystem);
_mediator.AddMessager(zs_User);
_mediator.AddMessager(ls_User);
Console.WriteLine("**********************************员工发送消息*******************************************");
_mediator.SendMessage("我的电脑有问题", zs_User);
Console.WriteLine("\r\n");
Console.WriteLine("**********************************管理员发送消息*******************************************");
_mediator.SendMessage("请大家及时杀毒", master);
Console.WriteLine("\r\n");
Console.WriteLine("**********************************系统发送消息*******************************************");
_mediator.SendMessage("系统发送故障,请稍后", aiSystem);
Console.ReadLine();
}
}
- 运行效果:
- 总结
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
代码下载地址:https://pan.baidu.com/s/17kPl1TeE1RRpjSoL2Yi4pA 5o5w