外观模式

前言

外观模式就相当于服务员,比如去餐厅吃饭时,服务员首先会给你菜单让你点菜,给你端茶递菜,然后清理桌子。这些都是服务员去做的,我们只需要享受他们提供的服务即可,不用亲自上阵。

 1.外观模式详解

手游启动的时候,会有一大堆准备动作,首先会检查资源和代码是否需要热更新,步骤二如果需要热更新就远程获取新的资源与本地的资源进行替换,步骤三初始化游戏各个模块的管理器和接入游戏的SDK,步骤四本地配置文件的初始化。这里我们就可以使用外观模式去实现这个功能,具体代码如下:

    public interface IGameModule
    {
        void Execute();
    }

    public class CheckResourceGameModule : IGameModule
    {
        public void Execute()
        {
            Console.WriteLine("检查资源更新");
        }
    }

    public class LoadResourceGameModule : IGameModule
    {
        public void Execute()
        {
            Console.WriteLine("下载资源更新");
        }
    }

    public class InitMangersGameModule : IGameModule
    {
        public void Execute()
        {
            Console.WriteLine("初始化游戏管理器");
        }
    }

    public class InitConfigsGameModule : IGameModule
    {
        public void Execute()
        {
            Console.WriteLine("本地配置文件初始化");
        }
    }


    public class GameMaker
    {
        private IGameModule checkResourceGameModel;
        private IGameModule loadResourceGameModule;
        private IGameModule initMangersGameModule;
        private IGameModule initConfigsGameModule;

        public GameMaker() {
            checkResourceGameModel = new CheckResourceGameModule();
            loadResourceGameModule = new LoadResourceGameModule();
            initMangersGameModule = new InitMangersGameModule();
            initConfigsGameModule = new InitConfigsGameModule();
        }

        public void InitGame()
        {
            checkResourceGameModel.Execute();
            loadResourceGameModule.Execute();
            initMangersGameModule.Execute();
            initConfigsGameModule.Execute();
        }
    }

这里我们看到游戏启动时的子模块全部集中放在外观类里,这样的好处就是降低访问复杂系统的内部子系统时的复杂度,其实以上的写法还是有缺点,接下来调整外观模式。

2.优化调整外观模式

以上写法的缺点就是当游戏启动阶段要添加额外启动的子模块,外观类里面要进行调整和修改,所以可以思考一下有没有更好的部分去减少代码改动?我们可以把子模块添加到静态列表里,让它们进行统一的操作,具体代码如下:

    public static class Global
    {
        public static List<IGameModule> GameModules = new List<IGameModule>();
    }

    public abstract class IGameModule:IDisposable
    {
        public IGameModule()
        {
            Global.GameModules.Add(this);
        }

        public void Dispose()
        {
            Global.GameModules.Remove(this);
        }

        public abstract void Execute();

    }

    public class CheckResourceGameModule : IGameModule
    {
        public override void Execute()
        {
            Console.WriteLine("检查资源更新");
        }

    }

    public class LoadResourceGameModule : IGameModule
    {
        public override void Execute()
        {
            Console.WriteLine("下载资源更新");
        }
    }

    public class InitMangersGameModule : IGameModule
    {
        public override void Execute()
        {
            Console.WriteLine("初始化游戏管理器");
        }
    }

    public class InitConfigsGameModule : IGameModule
    {
        public override void Execute()
        {
            Console.WriteLine("本地配置文件初始化");
        }
    }

    public class GameMaker:IDisposable
    {
        public GameMaker() {
            new CheckResourceGameModule();
            new LoadResourceGameModule();
            new InitMangersGameModule();
            new InitConfigsGameModule();
        }

        public void InitGame()
        {
            foreach (IGameModule gameModule in Global.GameModules)
            {
                gameModule.Execute();
            }
        }

        public void Dispose()
        {
            foreach (IGameModule gameModule in Global.GameModules)
            {
                gameModule.Dispose();
            }
        }
    }

这样多增加了一个模块时,只需要在GameMaker的构造函数里按照一定顺序去new,这样子模块就可以按照new的顺序去启动了子模块的功能了,但是需要小心的是外部不能直接去调用子模块的功能,还有就是保证GameMaker的构造函数仅仅启动一次,启动以后要确保把资源全部释放掉。

总结

1.外观模式的优缺点

优点:1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

2.外观模式的使用场景

1)子模块相互独立,为复杂模块或子系统提供外界访问的模块。

2)可以防止程序员去访问子模块,子模块的功能全部交给外观模式把控。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值