外观模式和中介者模式

主要功能是,将游戏的多个系统进行关联,逻辑更加清楚,调用很方便:


例子系统可能不全,只是举一个例子:

下图是游戏主要的系统:


外观模式和中介者模式_第1张图片
eg

成就系统示例,其他系统类似,几个方法的介绍:
第一个是构造函数,第二个是系统初始化,第三个是系统结束,第四个是系统更新,少了一个系统的开始的方法。

外观模式和中介者模式_第2张图片
Paste_Image.png
外观模式:

以上述案例为例,因为战斗系统需要使用到游戏的其他几个系统,通常的方式是在战斗系统中直接调用,但是使用到外观模式的话,创建一个总的调度类,让战斗系统和这个总的调度类完成其功能,调度类包含了其他系统的功能。(注意总的调度类是一个单例,需要用到单例模式)

外观模式和中介者模式_第3张图片
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();
        }

这两个模式的区别是,外观模式是针对模块的外部系统使用使用,相当于外观模式把一个系统所有的功能打包好了,提供一些接口给外界来使用这个系统的功能;
中介者模式是针对模块内部,各个系统之间的互相调度。

你可能感兴趣的:(外观模式和中介者模式)