这篇文章距离最后更新已过100 天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
定义
- 又叫门面模式
- 为子系统中的一组接口提供一个一致的界面,此模型定义了一个高层接口。这个接口使得这一子系统更加容易使用
- 就是对内部的方法进行封装,方便供外部调用(外部调用不用关注子系统实现细节)
使用场景
- 三层架构,界面层、逻辑层、数据层,层与层之间建立外观Facade
- 购买基金与单独购买股票区别,基金就是一个门面,包含了多支股票的买入卖出,用户不用关注每一支股票的买入卖出,直接操作基金即可
- 电脑的开机和关机,外观就是开关机,具体细节用户不用处理(比如启动关闭cpu、内存、硬盘、电源等)
代码实现
//子系统
public class SystemA
{
public void MethodA(){ }
}
//子系统
public class SystemB
{
public void MethodB(){ }
}
//子系统
public class SystemC
{
public void MethodC() { }
}
//外观类 门面类
class Facade
{
private SystemA sysA;
private SystemB sysB;
private SystemC sysC;
public Facade()
{
sysA = new SystemA();
sysB = new SystemB();
sysC = new SystemC();
}
//统一调用方法
public void MethodA()
{
sysA.MethodA();
sysB.MethodB();
}
//统一调用方法
public void MethodB()
{
sysA.MethodA();
sysC.MethodC();
}
}
void Main()
{
Facade fa = new Facade();
fa.MethodA();
fa.MethodB();
}
考虑使用外观模式的场景:
- 设计初期,将不同层分离,层与层建立外观模式
- 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口
- 维护大型的遗留系统的时候,维护和扩展很难,又需要包含重要的功能,
为其开发一个外观类,方便新系统与遗留系统交互
优点
- 体现 依赖倒转原则(电脑组装例子)和迪米特法则(子系统与门面认识,与客户端陌生)的思想
- 松散耦合: 松散了客户端与子系统的耦合关系,让子系统内部模块能更容易维护和扩展
- 简单易用:门面模式让子系统更加易用,客户端不再需要了解子系统的内部实现,也不需要跟子系统进行交互,和门面进行交互即可
- 更好划分层次:把一部分方法对外开放,一部分方法对内开放,也方便维护
缺点
- 不符合开闭原则,修改某个相关的子系统,对应外观类也需要一起修改