外观模式
外观模式又叫门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一的接口,外部应用不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性,外观模式包括以下主要角色:
- 外观角色:为多个子系统对外提供一个共同的接口
- 子系统角色:实现系统的部分功能,客户可以通过外观角色访问它
【案例】
小明的爷爷已经60多岁了,一个人在家生活。每次都需要打开灯、打开电视、打开空调,睡觉是要关闭空调、关闭电视、关闭灯。操作起来比较麻烦。所以小明给爷爷买了智能音箱,可以通过语音直接控制这些智能家电的开启和关闭。
public class FacadeTest { //客户端类
public static void main(String[] args) {
SmartFacade smartFacade = new SmartFacade();
smartFacade.say("打开家电");
System.out.println("------------");
smartFacade.say("关闭家电");
}
}
class Light{//子系统角色
public void on(){System.out.println("打开电灯");}
public void close(){System.out.println("关闭电灯");}
}
class TV{//子系统角色
public void on(){System.out.println("打开电视");}
public void close(){System.out.println("关闭电视");}
}
class AirCondition{//子系统角色
public void on(){System.out.println("打开空调");}
public void close(){System.out.println("关闭空调");}
}
class SmartFacade{//外观角色
private TV tv;
private Light light;
private AirCondition airCondition;
public SmartFacade() {
this.tv = new TV();
this.light = new Light();
this.airCondition = new AirCondition();
}
public void say(String message){
if (message.contains("打开")){
on();
}else if (message.contains("关闭")){
close();
}else{
System.out.println("小度正在努力学习中哦~~~");
}
}
private void on(){
light.on();
tv.on();
airCondition.on();
}
private void close(){
light.close();
tv.close();
airCondition.close();
}
}
外观模式的优缺点
- 优点:
降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响到调用它的客户类
对客户端屏蔽了子系统的组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易 - 缺点:
不符合开闭原则,修改较为麻烦
使用场景
1、对分层结构系统构建时,使用外观模式定义子系统中的每层入口点可以简化子系统之间的依赖关系
2、当一个系统的子系统很多时,外观模式可以为系统设计一个简单的接口共外界访问
3、当客户端给与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性