美文网首页
外观模式和中介者模式

外观模式和中介者模式

作者: 雨天到处晃 | 来源:发表于2017-03-31 19:28 被阅读0次

    主要功能是,将游戏的多个系统进行关联,逻辑更加清楚,调用很方便:
    <pre>
    例子系统可能不全,只是举一个例子:
    </pre>
    下图是游戏主要的系统:


    eg

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

    Paste_Image.png
    外观模式:

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

    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();
            }
    

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

    相关文章

      网友评论

          本文标题:外观模式和中介者模式

          本文链接:https://www.haomeiwen.com/subject/kvvmottx.html