外观模式
又称为门面模式,是一种通过多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体实现细节,这样会大大降低应用程序的复杂度,提高程序的可维护性。
这样做满足了迪米特法则——一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话
⭐结构
- 外观(Facade)——为多个子系统对外提供一个公共的接口
- 子系统(Sub System)——实现系统的部分功能,客户可以通过外观角色访问它
⭐案例
现在的音箱比较只能,可以语音下达命令,让它去开启关闭其他智能家电,这就是一个典型的外观模式:人只需要通过音箱提供的公共接口,就能实现各种功能
具体实现如下:
//电灯Light类
public void on() {
System.out.println("打开电灯");
}
public void off() {
System.out.println("关闭电灯")
}
//电视机类TV
public void on() {
System.out.println("打开电视");
}
public void off() {
System.out.println("关闭电视")
}
//空调类同理,不再赘述
接下来就是外观类,和用户进行交互,对上方各类进行操作
//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();
}
//关闭功能同理,不再赘述
⭐优缺点
优点
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类
- 对客户屏蔽了子组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易
缺点
- 不符合开闭原则,修改很麻烦!