外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
想要使用外观模式,我们创建了一个接口简化而统一的类,用来包装子系统中一个或多个复杂的类。外观模式相当直接,很容易理解,这方面和许多其他的模式不太一样。但这并不会降低它的威力:外观模式允许我们让客户和子系统之间避免紧耦合。
外观模式也可以帮我们遵守一个新的面向对象原则:最少知识原则。 最少知识原则告诉我们要减少对象之间的交互,只留下几个“密友”,这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。
类图: Facade类其实相当于A、B、C模块的外观界面,有了这个Facade类,那么客户端就不需要亲自调用子系统中的A、B、C模块了,也不需要知道系统内部的实现细节,甚至都不需要知道A、B、C模块的存在,客户端只需要跟Facade类交互就好了,从而更好地实现了客户端和子系统中A、B、C模块的解耦,让客户端更容易地使用系统。
利用外观模式实现控制家里电器设备的开关,当在家时打开电视,打开灯,打开空调。当离开家时关闭电视,关闭灯,关闭空调。 类图: TV类代码实现:
public class TV { public void on(){ System.out.PRintln("打开电视"); } public void off(){ System.out.println("关闭电视"); }}Light类代码实现:
public class Light { public void on(){ System.out.println("打开电灯"); } public void off(){ System.out.println("关闭电灯"); }}AirConditioner类代码实现:
public class AirConditioner { public void on(){ System.out.println("打开空调"); } public void off(){ System.out.println("关闭空调"); }}Façade类代码实现:
public class Facade { TV tv; Light light; AirConditioner airConditioner; public Facade(TV tv,Light light,AirConditioner airConditioner){ this.tv = tv; this.light = light; this.airConditioner = airConditioner; } public void atHome(){ tv.on(); light.on(); airConditioner.on(); } public void leaveHome(){ tv.off(); light.off(); airConditioner.off(); }}Client类代码实现:
public class Client { public static void main(String[]args){ TV tv = new TV(); Light light = new Light(); AirConditioner airConditioner = new AirConditioner(); Facade facade = new Facade(tv, light, airConditioner); //在家时 System.out.println("------at home-------"); facade.atHome(); //离家时 System.out.println("------leave home-------"); facade.leaveHome(); }}运行结果:
------at home-------打开电视打开电灯打开空调------leave home-------关闭电视关闭电灯关闭空调新闻热点
疑难解答