一、使用中介者模式的原因
随着项目功能越多,系统切分越细,系统之间的沟通越复杂,这时系统内部如果一直保存这种状态,就会产生如下缺点:
- 单一系统引入太多其他系统的功能,不利于单一系统的转换和维护;
- 单一系统被过多的系统所依赖,不利于接口的更改,容易牵一发而动全身;
- 因为需提供给其他系统操作,系统的接口可能过于庞大,不容易维护;
要解决上述问题,可以使用中介者模式的设计方法。
二、中介者模式的定义
中介者模式简单解释的话,比较类似于中央管理的概念:建一个信息集中的中心,任何子系统要与它的子系统沟通时,都必须先将请求交给中央单位,再由中央单位分配给对应的子系统。
中介者模式在GoF中的说明:定义一个接口用来封装一群对象的互动行为。中介者通过移除对象之间的引用,来减少它们之间的耦合度,并且能改变它们之间的互动独立性。
三、中介者模式的使用说明
创建一个中介者模式的结构如图:
其中的参与者如下:
Colleague(同事接口)
- 拥有一个Mediator属性成员,可以通过它来调用中介的功能。
ConcreteColleagueX(同事接口实现类)
- 实现Colleague界面的类,对于单一实现类而言,只会依赖一个Mediator接口。
Mediator(中介者接口)、ConcreteMediator(中介者接口实现类)
- 由Mediator定义让Colleague类操作的接口。
- ConcreteMediator实现类中包含所有ConcreteColleague的对象引用。
- ConcreteMediator类之间的互动会在ConcreteMediator中发生。
介绍一个GoF范例程序如下:
Colleague(同事接口)
public abstract class Colleague { protected Mediator mediator = null;//通过Mediator对外沟通 public Colleague(Mediator mediator) { this.mediator = mediator; } ////// Mediator 请求通知 /// public abstract void Request(string message); }
Colleague为抽象类,拥有一个类型为Mediator的属性成员mediator ,用来指向中介者,而这个中介者会在建造者中被指定。
实现各Colleague类:
public class ConcreteColleague1:Colleague { public ConcreteColleague1(Mediator mediator):base(mediator) { } ////// 执行动作 /// public void Action() { //执行后需要通知其他Colleague mediator.SendMessage(this, "Colleage1 发出通知"); } ////// Mediator 通知请求 /// /// public override void Request(string message) { } } public class ConcreteColleague2:Colleague { public ConcreteColleague2(Mediator mediator):base(mediator) { } ////// 执行动作 /// public void Action() { //执行后需要通知其他Colleague mediator.SendMessage(this, "Colleage2 发出通知"); } ////// Mediator 通知请求 /// /// public override void Request(string message) { } }
每一个继承自Colleague的ConcreteColleagueX类,需要对外界沟通时,都会通过mediator来传递信息。
Mediator接口,用来管理Colleague对象的接口:
public abstract class Mediator { public abstract void SendMessage(Colleague colleague, string message); }
Mediator定义了一个抽象方法SendMessage(),主要用于从外界传递信息给Colleague。
最后,实现ConcreteMediator类,该类拥有所有“要在内部进行沟通的Colleague子类的引用”:
public class ConcreteMediator:Mediator { ConcreteColleague1 colleague1 = null; ConcreteColleague2 colleague2= null; public void SetColleague1(ConcreteColleague1 colleague1) { this.colleague1 = colleague1; } public void SetColleague2(ConcreteColleague2 colleague2) { this.colleague2 = colleague2; } ////// 收到来自Colleague请求 /// public override void SendMessage(Colleague colleague, string message) { //收到colleague1通知colleague2 if (colleague1 == colleague) colleague2.Request(message); //收到colleague2通知colleague1 if (colleague2 == colleague) colleague1.Request(message); } }
实现中介者模式的测试:
public class MediatorTest { public void UnitTest() { //产生中介者 ConcreteMediator concreteMediator = new ConcreteMediator(); //产生两个Colleague ConcreteColleague1 colleague1 = new ConcreteColleague1(concreteMediator); ConcreteColleague2 colleague2 = new ConcreteColleague2(concreteMediator); //设置给中介者 concreteMediator.SetColleague1(colleague1); concreteMediator.SetColleague2(colleague2); //执行 colleague1.Action(); colleague2.Action(); } }
四、中介者模式的优点和注意事项
中介者模式具备以下优点:
不会引入太多其他的系统; 系统被依赖的程度也降低;
注意事项:
1、在某些情况下会出现中介者类担任过多中介者角色而产生“操作接口爆炸”的情况,这时需要配合其他设计模式来处理。
2、中介者接口没有继承任何接口类。这样对于所有游戏系统和玩家界面而言,它们所依赖的将是“接口”而不是“实现”,这样会更符合开—闭原则(OCP),从而提高游戏系统和玩家界面的可移植性。
总结:
中介者模式的优点是能让系统之间的耦合度降低,提升系统的可维护性。但身为模式中的中介者角色类,也会存在接口过大的风险,此时必须配合其他模式来进行优化。
到此这篇关于Unity游戏开发中的中介者模式的应用与实现的文章就介绍到这了,更多相关Unity中介者模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!