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