前置文章: 设计模式的原则
其他设计模式:用心理解设计模式专栏
设计模式相关代码已统一放至 我的 Github
一、定义
结构型模式之一。
Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
(为子系统中的一组接口提供一个统一的接口。门面模式定义了一个更高层次的接口,使得子系统更为易用。)
二、结构解析
外观模式的一般结构有两种角色: 子系统、外观。
子系统(SubSystem),不一定是一个实体类,可能只是一些有关联的模块的集合。对外提供一组可独立使用的接口。
外观(Facade),将子系统的一组可独立使用的接口,组织封装为一个具有高级功能的接口。
三、评价
外观模式,通过新增一个外观类,解除了客户与子系统的直接耦合(在客户较多、子系统独立功能较多时尤为明显,存在复杂的网状耦合)。
外观模式符合迪米特法则,它让客户得以体验一条龙便捷服务,而不用关心细节。比如婚庆包办、一键安装LNMP等。
外观模式的符合开闭原则,最终新增了一个高级接口,但没有对子系统做任何修改。
using UnityEngine;
namespace Facade
{
//外观类
public class Facade
{
SubSystem.ModuleA moduleA = new SubSystem.ModuleA();
SubSystem.ModuleB moduleB = new SubSystem.ModuleB();
SubSystem.ModuleC moduleC = new SubSystem.ModuleC();
public void DoSth()
{
moduleA.DoSthA();
moduleB.DoSthB();
moduleC.DoSthC();
}
}
//子系统,由多个由关联的模块组成而成的一个系统
public class SubSystem
{
public class ModuleA
{
public void DoSthA()
{
Debug.Log("做A事情");
}
}
public class ModuleB
{
public void DoSthB()
{
Debug.Log("做B事情");
}
}
public class ModuleC
{
public void DoSthC()
{
Debug.Log("做C事情");
}
}
}
public class Client
{
static public void Main()
{
//new SubSystem.ModuleA().DoSthA();
//new SubSystem.ModuleB().DoSthB();
//new SubSystem.ModuleC().DoSthC();
//使用同一的接口,避免访问子系统的细节模块
new Facade().DoSth();
}
}
}