定义
又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用不关心内部子系统的具体细节,这样会大大降低应用程序的复杂性,提高了程序的可维护性。
案例:智能家电控制系统
小明的爷爷年纪大了,一个人在家生活,每天都要开灯、开电视、开空调;关灯、关电视、关空调。小明给爷爷买了只能音响,可以通过语音控制之前全部开启或全部关闭家电。
电灯类
package com.hupp.facade;
public class Light {
public void on(){
System.out.println("开灯");
}
public void off(){
System.out.println("关灯");
}
}
电视类
package com.hupp.facade;
public class TV {
public void on(){
System.out.println("开电视");
}
public void off(){
System.out.println("关电视");
}
}
空调类
package com.hupp.facade;
public class AirCondition {
public void on(){
System.out.println("开空调");
}
public void off(){
System.out.println("关空调");
}
}
智能音箱类:外观模式的统一api
package com.hupp.facade;
/**
* 外观类,主要和客户端交互
*/
public class SmartAppliancesFacade {
private Light light;
private TV tv;
private AirCondition airCondition;
public SmartAppliancesFacade() {
light = new Light();
tv = new TV();
airCondition = new AirCondition();
}
public void say(String message) {
if (message.contains("打开")) {
on();
} else if(message.contains("关闭")) {
off();
}else{
System.out.println("无法识别的语音");
}
}
private void on(){
light.on();
tv.on();
airCondition.on();
}
private void off(){
light.off();
tv.off();
airCondition.off();
}
}
客户端
package com.hupp.facade;
public class Client {
public static void main(String[] args) {
SmartAppliancesFacade facade = new SmartAppliancesFacade();
facade.say("打开家电");
System.out.println("-------------");
facade.say("关闭家电");
}
}
执行结果
优点
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统更加容易使用
缺点
- 不符合开闭原则,修改起来比较麻烦
使用场景
- 当一个复杂的系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
- 当客户端与多个子系统之间存在很大的联系时,使用外观模式可将他们分离,从而提高子系统的独立性和可移植性