中介者模式
介绍
|------|------------------------------------------------------------|---------|---------------------|-----------------|
| 设计模式 | 定义 | 案例 | 问题堆积在哪里 | 解决办法 |
| 中介者 | 代替了多个对象之间的互动 使对象1 2 3 之间的互动 变为: 对象1->中介 对象2->中介 对象3->中介 | 好友之间 约饭 | 好友1 通知 好友2 -3 -4 等等 | 加一个群 谁想吃饭就 通知一下 |
类图
代码
角色
BasePeople // 基类
FriendA
FriendB
FriendC
FriendGroup // 群
BasePeople
cs
public abstract class BasePeople
{
public string name;
public abstract void ReceiverMsg(string msg);
public abstract void Send(string msg);
}
FriendA
cs
using UnityEngine;
public class FriendA : BasePeople
{
FriendA() { }
public FriendA(string name)
{
this.name = name;
}
public override void ReceiverMsg(string msg)
{
Debug.Log(name + "接收:" + msg);
}
public override void Send(string msg)
{
Debug.Log(name + "发送:" + msg);
FriendGroup.GetIns().SendAllPeopleMsg(name, msg);
}
}
FriendB 类似A
FriendC类似A
FriendGroup
cs
using System.Collections.Generic;
public class FriendGroup
{
//---------------------------------------------
static FriendGroup self = null;
private FriendGroup() { }
public static FriendGroup GetIns()
{
if (null == self)
{
self = new FriendGroup();
}
return self;
}
//--------------------------------------------
List<BasePeople> gruop = new List<BasePeople>();
// 添加
public void AddPeople(BasePeople friend)
{
if (null == friend)
return;
gruop.Add(friend);
}
// 发送
public void SendAllPeopleMsg(string senderName, string msg)
{
foreach (var item in gruop)
{
if (senderName != item.name)
{
item.ReceiverMsg(msg);
}
}
}
}
测试代码
cs
using UnityEngine;
public class TestZJZ : MonoBehaviour
{
void Start()
{
// 创建people
BasePeople p1 = new FriendA("P1");
BasePeople p2 = new FriendA("P2");
BasePeople p3 = new FriendA("P3");
// 创建群
FriendGroup group = FriendGroup.GetIns();
group.AddPeople(p1);
group.AddPeople(p2);
group.AddPeople(p3);
p3.Send("晚上8点吃饭!");
}
}
结果
总结
在 多对象之间互相通信 提炼出一个中介者 ,会让类图变得简单漂亮