- 什么是中介者模式/它有什么用?
举个栗子
玩过手机游戏 或者PC游戏的 曾游戏玩家们(老夫看你骨骼精奇,我知道,在你当程序员之前,一定是一个爱玩游戏的傻小子吧),你们应该都知道游戏里的喇叭道具吧,道具的效果是:购买此道具的玩家可以使用一次“给全部玩家发送一次信息的权限”,就像这样————
那么 请问!!
使用此道具的玩家的客户端是如何发送讯息的呢?其他玩家又是如何看到讯息的?
难道是使用此道具的玩家客户端直接访问其他玩家的客户端,然后在他们的显示器上抠字吗??
当然不是,如果真的像刚才我说的那样的话,使用此道具的玩家的客户端上必须存有全部其他玩家的地址信息,并且当使用此道具的玩家点击发送讯息时,必须在极快的时间内调用全部其他客户端上的显示信息的函数,然后你的电脑就会因为工作量太大而爆炸。。。这种方法显然很扯淡
正常的方式是:客户端调用自身的,向服务器上的发送讯息的函数,然后由服务器调用其他客户端上的显示信息函数,这样的话喇叭效果就完成了
这,就叫中介者模式。
那,有什么用呢?降低程序的耦合性,当某个玩家删号的时候(不再使用某个同事时),不会影响到其他人。总之,你想让某个类容易被移植到别的位置,就用吧(把它写成同事,千万别傻傻的把它写成中介者)。
- 中介者模式的核心写法/如何写一个中介者模式?
1、写出中介者模式(Mediator)(这里我是用接口写的) 以及同事类(Colleague)的抽象层;
/// <summary>
/// 抽象同事类
/// </summary>
public abstract class Colleague
{
protected IMediator mediator;
/// <summary>
/// 步骤3 同事类的构造函数主要功能 是让同事认识中介者
/// </summary>
/// <param name="mediator">给自身的中介者实例赋值</param>
public Colleague(IMediator mediator)
{
this.mediator = mediator;
}
/// <summary>
/// 给留给中介者调用的方法
/// </summary>
public abstract void labaJieshou接收喇叭消息(string Message);
}
/// <summary>
/// 抽象中介者层 中介者类不会主动调用其它同事类 只会在其他同事类申请调用的时候,中介者才会干活
/// </summary>
public interface IMediator
{
void SendMassge向其他同事发送信息(string str, Colleague colleague发送者);
}
2、实现步骤1;
/// <summary>
/// 实体同事A
/// </summary>
public class ColleagueConcreateA : Colleague
{
public ColleagueConcreateA(IMediator mediator) : base(mediator)
{
}
/// <summary>
/// 调用中介者中的的方法
/// </summary>
public void labaQuanqu使用全区喇叭(string message要发送的信息,Colleague colleague发送者)
{
mediator.SendMassge向其他同事发送信息("message要发送的信息", colleague发送者);
}
/// <summary>
/// 重写抽象方法,这个方法只能中介者使用,只能中介者使用,只能中介者使用
/// </summary>
public override void labaJieshou接收喇叭消息(string Message)
{
SetText显示UI文字(Message);
}
public void SetText显示UI文字(string text要显示的文字)
{
Debug.Log(text要显示的文字);
}
}
/// <summary>
/// 实体中介者
/// </summary>
public class MediatorConcreate : IMediator
{
/// <summary>
/// 步骤3 这个步骤是为了提供给其他这个类型的类一个 可以被中介者认识此同事的方法;
/// </summary>
public ColleagueConcreateA concreateA;
public void SetColleagueConcreateA(ColleagueConcreateA colleagueConcreate)
{
concreateA = colleagueConcreate;
}
public void SendMassge向其他同事发送信息(string str传进来的信息, Colleague colleague)
{
concreateA.labaJieshou接收喇叭消息(str传进来的信息);
}
}
3.1、在中介者模式中写上SetColleagueA方法(有几个同事写几个方法;目的是让中介者认识这个同事)
3.2、在同事类中写上针对中介者的构造函数(目的是让这个同事认识这个中介者)
使用方法
1、new中介者
mediatorConcreate服务器 = new MediatorConcreate();
2、new全部同事类,并用同事类的构造函数让自己认识中介者
//大家互相认识的过程
yuanfenao缘分嗷 = new ColleagueConcreateA(mediatorConcreate服务器);
3、使用在中介者中,对应同事类的Set方法(让中介者认识这个同事)
mediatorConcreate服务器.SetColleagueConcreateA(yuanfenao缘分嗷);
4、使用同事类中的方法(建议只有同事类调用中介者)
yuanfenao缘分嗷.labaQuanqu使用全区喇叭("钱柜皮西裙 112983 每天滴滴滴 详细加裙 私聊管理 滴滴滴哦", yuanfenao缘分嗷);
完整代码:
public MediatorConcreate mediatorConcreate服务器;
public ColleagueConcreateA yuanfenao缘分嗷;
void Start () {
//创建中介者
mediatorConcreate服务器 = new MediatorConcreate();
//大家互相认识的过程
yuanfenao缘分嗷 = new ColleagueConcreateA(mediatorConcreate服务器);
mediatorConcreate服务器.SetColleagueConcreateA(yuanfenao缘分嗷);
yuanfenao缘分嗷.labaQuanqu使用全区喇叭("钱柜皮西裙 112983 每天滴滴滴 详细加裙 私聊管理 滴滴滴哦", yuanfenao缘分嗷);
}