外观模式
定义
外观模式(Facade)
“为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用”
解释:
外观模式其实相当容易理解,假设我们有非常多的子系统,每个系统各自又有很多的接口,这使得这些系统阅读和使用起来非常不便,而一般的客户并不关心子系统的细节,他们只关注于有限的一些内容,所以我们需要一个门面(facade)去让他能够更简单的使用这些系统。
UML
相当容易理解的类图
代码
子系统们
namespace DesignModel.Facade
{
public class SubSystemA
{
public void OperateOne()
{
Debug.Log("SubSystem A : One");
}
public void OperateTwo()
{
Debug.Log("SubSystem A : Two");
}
}
public class SubSystemB
{
public void Operate1()
{
Debug.Log("SubSystem B : 1");
}
public void Operate2()
{
Debug.Log("SubSystem B : 2");
}
}
}
门面(Facade)
namespace DesignModel.Facade
{
public class Facade
{
private SubSystemA subSystemA;
private SubSystemB subSystemB;
public Facade()
{
subSystemA = new SubSystemA();
subSystemB = new SubSystemB();
}
public void OperateOne()
{
Debug.Log("Show One Operata : ");
subSystemA.OperateOne();
subSystemB.Operate1();
}
public void OperateNumber()
{
Debug.Log("Show Arabic Numerals Operata : ");
subSystemB.Operate1();
subSystemB.Operate2();
}
}
}
简单测试
using DesignModel.Facade;
public class Client_Facade : MonoBehaviour
{
void Start ()
{
Facade facade = new Facade();
facade.OperateOne();
facade.OperateNumber();
}
}
测试结果
拓展
外观模式非常简单,就是对已有系统做一次包装,以方便客户的使用
外观模式不局限于对类的包装,简单一些的应用也可以是同个类中对函数的包装
外观模式同适配器模式非常类似,区别仅在于,适配器模式是为了将接口更换为目标接口,外观模式是为了将子系统整合提供一个门面
优点
1.屏蔽了子系统,使客户的使用起来更加简单
2.使客户端和子系统之间解藕,子系统的变化不会影响到客户端
缺点
增加新的子系统或修改现有的系统可能需要修改外观类或客户端,违背了“开闭原则”。
在实际应用中
我们经常用到外观模式对类的功能分层整理
同时在对接新的插件时,尽量对需要的功能做一次封装(适配器或外观),一旦更换插件或插件本身的接口作出改变后,可以在不改动现有代码的情况下,仅对适配器或外观进行修改即可。