Unity外观模式

理解外观模式

为子系统提供一组统一的高层接口,使子系统更加容易使用,这就是外观模式。外观模式可以将代码的复杂性封装起来并对外提供一个访问接口,让编程人员在使用的时候仅仅需要调用访问接口,而不需要关心内部复杂代码的实现和功能。在游戏的开发过程中,我们避免不了将游戏常用的功能封装为系统来进行使用,如游戏中都会有音乐、音效,我们就可以封装一个音频管理系统;游戏中可能会有多种类型的物品,我们就可以封装一个物品管理系统;游戏中可能会有任务模块,并允许玩家进行任务的接收和拒绝,我们就可以封装一个任务管理系统。总之,在游戏的制作过程中,我们会封装大量的系统,使我们的开发更加便捷。当系统封装得过多的时候,我们可以使用外观模式来管理这些系统,以进一步地优化我们的代码。在上一节中我们使用状态模式来对学生类进行了代码优化,这里我们可以把学生看作一个系统。除了学生,可能还有教师、工人和家长等不同系统,状态模式可以对这些系统分别进行优化。但是当系统本身的数量增加后,使用起来依然有些复杂,这时就可以使用外观模式来对这些系统进行封装。

优缺点

优点

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();
        }
    }
}
上一篇
下一篇