前言
外观模式就相当于服务员,比如去餐厅吃饭时,服务员首先会给你菜单让你点菜,给你端茶递菜,然后清理桌子。这些都是服务员去做的,我们只需要享受他们提供的服务即可,不用亲自上阵。
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)可以防止程序员去访问子模块,子模块的功能全部交给外观模式把控。