游戏中的设计模式二:外观模式
发表于2018-03-25
上篇文章介绍了设计模式中的单例模式与状态模式,接着后面的设计模式介绍,本篇文章和大家介绍外观模式。


在游戏中一个场景可能需要与多个系统进行信息交互,比如战斗系统,背包系统,经济系统等,在编写代码时候势必要将各个系统之间的通信和依赖降低到尽可能的小。这时候使用外观模式最适合,将应用程序只能看到外观(facade)对象,不需要关注内部的细节对象,从而降低应用程序的复杂度,提高应用程序的可维护性。
案例分析

外观模式整理后

这样让外部减少与子系统内多个模块的交互,松散耦合,从而使外部能够更简单地使用各个子系统。
代码编写
以上篇文章项目继续开发,比如在战斗场景中初始化各个系统
using System; using System.Collections.Generic; using System.Text; using UnityEngine.SceneManagement; class BattleScene : ISceneState { public BattleScene() : base("BattleScene") { } public override void StartScene() { SceneManager.LoadScene(this.mSceneName); BattleSystem bs = new BattleSystem(); bs.Init(); PacketSystem ps = new PacketSystem(); ps.Init(); GoldSystem gs = new GoldSystem(); gs.Init(); } }
使用外观模式管理代码如下:
Facade.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Facad { public void Init() { BattleSystem bs = new BattleSystem(); bs.Init(); PacketSystem ps = new PacketSystem(); ps.Init(); GoldSystem gs = new GoldSystem(); gs.Init(); } }
在战斗场景内调用Facade来初始化各个子系统
using System; using System.Collections.Generic; using System.Text; using UnityEngine.SceneManagement; class BattleScene : ISceneState { public BattleScene() : base("BattleScene") { } public override void StartScene() { SceneManager.LoadScene(this.mSceneName); Facade facade = new Facade(); facade.Init(); } }
但是外观模式的缺点显而易见了,违背了设计原则的开闭原则,当我们有其他系统需要做初始化工作时候将修改Facade。