理解外观模式
为子系统提供一组统一的高层接口,使子系统更加容易使用,这就是外观模式。外观模式可以将代码的复杂性封装起来并对外提供一个访问接口,让编程人员在使用的时候仅仅需要调用访问接口,而不需要关心内部复杂代码的实现和功能。在游戏的开发过程中,我们避免不了将游戏常用的功能封装为系统来进行使用,如游戏中都会有音乐、音效,我们就可以封装一个音频管理系统;游戏中可能会有多种类型的物品,我们就可以封装一个物品管理系统;游戏中可能会有任务模块,并允许玩家进行任务的接收和拒绝,我们就可以封装一个任务管理系统。总之,在游戏的制作过程中,我们会封装大量的系统,使我们的开发更加便捷。当系统封装得过多的时候,我们可以使用外观模式来管理这些系统,以进一步地优化我们的代码。在上一节中我们使用状态模式来对学生类进行了代码优化,这里我们可以把学生看作一个系统。除了学生,可能还有教师、工人和家长等不同系统,状态模式可以对这些系统分别进行优化。但是当系统本身的数量增加后,使用起来依然有些复杂,这时就可以使用外观模式来对这些系统进行封装。
优缺点
优点
1、引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系。
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
缺点
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
使用场景
1、当要为一个复杂子系统提供一个简单接口时可以使用外观模式。
2、客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性
模式总结
1、 外观模式的主要优点就在于减少了客户与子系统之间的关联对象,使用客户对子系统的使用变得简单了,也实现了客户与子
系统之间的松耦合关系。它的缺点就在于违背了“开闭原则”。
2、 如果需要实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行。
实现步骤
将所有系统都封装到一个单独的外观类中,在该外观类中对常用的系统方法都添加对外的接口方法
using UnityEngine; namespace Student { public class SystemBase { public virtual void Run() { } } public class StudentSystem : SystemBase { public override void Run() { Debug.Log("我是学生系统"); } } public class TeacherSystem : SystemBase { public override void Run() { Debug.Log("我是教师系统"); } } public class WorkerSystem : SystemBase { public override void Run() { Debug.Log("我是工人系统"); } } // 创建一个外观类 public class Facade { private StudentSystem _studentSystem; private TeacherSystem _teacherSystem; private WorkerSystem _workerSystem; public Facade() { _studentSystem = new StudentSystem(); _teacherSystem = new TeacherSystem(); _workerSystem = new WorkerSystem(); } public void StudentRun() { _studentSystem.Run(); } public void TeacherRun() { _teacherSystem.Run(); } public void WorkerRun() { _workerSystem.Run(); } } public class FacadeTest : MonoBehaviour { private void Start() { Facade facade = new Facade(); facade.StudentRun(); facade.WorkerRun(); facade.TeacherRun(); } } }