外观模式是一种结构型模式,外观模式又叫做门面模式,是为了给一个复杂的子系统提供一个更加容易被访问的统一接口。在该模式下有个对外的统一接口,使用者不需要了解接口内部的详细情况,只需要调用统一接口来实现自己的目的即可。
举例:现在智能语音家居使用广泛,我们可以使用智能家居帮我们开窗帘、开空调、开灯等等。当到了晚上时,我们就像睡觉了,这个时候我们告诉智能家居说:“我要睡觉了”,这时智能家居就会做很多事情,帮我们关闭窗帘、关闭电视机、将空调温度调到刚刚好等等一系列最有助于睡眠的状态。
我们实际上是不需要知道具体要做什么,只需要告诉它我要睡觉了,它就自动帮我们做完了。这就是外观模式的体现。
这样子能够大大的降低程序的复杂程度,提高了程序的可维护性。
外观模式是迪米特法则的典型应用。
外观模式主要有两种角色:
-
外观角色:为多个子系统提供一个统一的接口。比如只能家具。
-
子系统角色:实现系统的部分功能,可以供外观角色调用。比如电视机、灯等等。
代码实现:
1、创建子角色,空调、电视机和点灯,每个角色中提供了一些针对该对象进行操作的方法。
/**
* 空调
*/
public class AirCondition {
public void on(){
System.out.println("打开空调");
}
public void off(){
System.out.println("关闭空调");
}
public void sleep(){
System.out.println("将空调温度调整到 26 摄氏度,睡觉模式");
}
}
/**
* 电灯
*/
public class Light {
public void on(){
System.out.println("打开电灯");
}
public void off(){
System.out.println("关闭电灯");
}
public void sleep(){
System.out.println("打开蓝色灯光,适合睡觉");
}
}
/**
* 电视机
*/
public class TV {
public void on(){
System.out.println("打开电视机");
}
public void off(){
System.out.println("关闭电视机");
}
}
2、创建外观角色,智能家居【小爱同学】,需要管理家电,所以需要将家电聚合到智能家居中,并提供睡觉模式方法。
public class XiaoaiTongxue {
private TV tv;
private Light light;
private AirCondition airCondition;
public XiaoaiTongxue() {
tv = new TV();
light = new Light();
airCondition = new AirCondition();
}
public void sleep(){
System.out.println("主人要休息了");
tv.off();
airCondition.sleep();
light.sleep();
System.out.println("主人,环境已经调到睡觉模式,晚安");
}
}
3、测试
public static void main(String[] args) {
XiaoaiTongxue xiaoai = new XiaoaiTongxue();
xiaoai.sleep();
}
//测试结果
主人要休息了
关闭电视机
将空调温度调整到 26 摄氏度,睡觉模式
打开蓝色灯光,适合睡觉
主人,环境已经调到睡觉模式,晚安
Process finished with exit code 0
好处:
-
降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
-
对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
坏处:不符合开闭原则,修改很麻烦