什么是外观模式?
定义了一个高层、统一的接口,外部与通过这个统一的接口对子系统中的一群接口进行访问。通过创建一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以通过调用外观类的方法来调用内部子系统中所有方法
解决问题
● 避免了系统与系统之间的高耦合度
● 使得复杂的子系统用法变得简单
结构图
注意点
从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。
Façade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Façade很多时候更是一种架构设计模式。
Façade设计模式并非一个集装箱,可以任意地放进任何多个对象。Façade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。
注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。
代码
● 背景:小成的爷爷已经80岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;
● 冲突:行动不方便,走过去关闭那么多电器很麻烦,代码如下:
//灯类 public class SubSystemA_Light { public void on() { Console.WriteLine("打开了灯...."); } public void off() { Console.WriteLine("关闭了灯...."); } } //电视类 public class SubSystemB_Television { public void on() { Console.WriteLine("打开了电视...."); } public void off() { Console.WriteLine("关闭了电视...."); } } //空调类 public class SubSystemC_Aircondition { public void on() { Console.WriteLine("打开了空调...."); } public void off() { Console.WriteLine("关闭了空调...."); } } public class Facade { SubSystemA_Light light; SubSystemB_Television television; SubSystemC_Aircondition aircondition; //传参 public Facade(SubSystemA_Light light, SubSystemB_Television television, SubSystemC_Aircondition aircondition) { this.light = light; this.television = television; this.aircondition = aircondition; } //起床后一键开电器 public void on() { Console.WriteLine("起床了"); light.on(); television.on(); aircondition.on(); } public void off() { //睡觉时一键关电器 Console.WriteLine("睡觉了"); light.off(); television.off(); aircondition.off(); } public static void Main(String[] args) { { //实例化电器类 SubSystemA_Light light = new SubSystemA_Light(); SubSystemB_Television television = new SubSystemB_Television(); SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition(); //传参 Facade facade = new Facade(light, television, aircondition); //客户端直接与外观对象进行交互 facade.on(); Console.WriteLine("可以看电视了"); facade.off(); Console.WriteLine("可以睡觉了"); }