主要功能是,将游戏的多个系统进行关联,逻辑更加清楚,调用很方便:
<pre>
例子系统可能不全,只是举一个例子:
</pre>
下图是游戏主要的系统:
eg
成就系统示例,其他系统类似,几个方法的介绍:
第一个是构造函数,第二个是系统初始化,第三个是系统结束,第四个是系统更新,少了一个系统的开始的方法。
外观模式:
以上述案例为例,因为战斗系统需要使用到游戏的其他几个系统,通常的方式是在战斗系统中直接调用,但是使用到外观模式的话,创建一个总的调度类,让战斗系统和这个总的调度类完成其功能,调度类包含了其他系统的功能。(注意总的调度类是一个单例,需要用到单例模式)
Paste_Image.png中介者模式:
在游戏中,很多系统内部需要互相调度,如果是各个系统之间直接互相调度的话,逻辑会非常复杂,很容易混乱,采用中介者模式的话,增加一个中介者功能的类,负责调度所有系统,其余的子系统只需要和中介者类交互即可,逻辑就很简单了。
写的时候注意要在中介者类需要重新写所有子系统中的公共方法,让其他的子系统调用。
eg,p1和p2通过中介发送消息:
//person和Zj的总抽象类
abstract class Zj
{
//参数意思:发送的消息内容,是谁发送
public abstract void ReSend(string msg, Person person);
}
abstract class Person
{
protected Zj zj;
public Person(Zj zj)
{
this.zj = zj;
}
}
继承抽象类的类
//中介者类
class ZJ_1:Zj
{
private Person1 p1;
private Person2 p2;
//初始化需要发送消息的人
public Person1 P1
{
set { p1 = value; }
}
public Person2 P2
{
set { p2 = value; }
}
//转发person的消息
public override void ReSend(string msg, Person person)
{
if (person == p1)
{
p2.Receive(msg);
}
else
{
p1.Receive(msg);
}
}
}
发送消息的人类:
//person1
class Person1:Person
{
public Person1(ZJ_1 zj) : base(zj)
{
}
public void Send(string msg)
{
zj.ReSend(msg,this);
}
public void Receive(string msg)
{
Console.WriteLine("Person1收到消息:"+msg);
}
}
//person2
class Person2:Person
{
public Person2(ZJ_1 zj) : base(zj)
{
}
public void Send(string msg)
{
zj.ReSend(msg,this);
}
public void Receive(string msg)
{
Console.WriteLine("Person2收到消息:" + msg);
}
}
主函数体:
//实现方式
static void Main(string[] args)
{
ZJ_1 z=new ZJ_1();//创建中介者实力
Person1 p1 = new Person1(z);//创建p1实例,同时把中介者传入
Person2 p2 = new Person2(z);//创建p2实例,同时把中介者传入,需要与p1一致
//在中介者中初始化需要通信的两个人物
z.P1 = p1;
z.P2 = p2;
//直接在人物中调用send方法,send方法会自动调用zj的resend方法发送消息给p2
p1.Send("你好啊,P2");
p2.Send("你也好啊,p1");
Console.ReadKey();
}
这两个模式的区别是,外观模式是针对模块的外部系统使用使用,相当于外观模式把一个系统所有的功能打包好了,提供一些接口给外界来使用这个系统的功能;
中介者模式是针对模块内部,各个系统之间的互相调度。
网友评论