外观模式

117 阅读2分钟

外观模式

又称为门面模式,是一种通过多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。

该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体实现细节,这样会大大降低应用程序的复杂度,提高程序的可维护性。

design.png

这样做满足了迪米特法则——一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话

⭐结构

  • 外观(Facade)——为多个子系统对外提供一个公共的接口
  • 子系统(Sub System)——实现系统的部分功能,客户可以通过外观角色访问它

⭐案例

现在的音箱比较只能,可以语音下达命令,让它去开启关闭其他智能家电,这就是一个典型的外观模式:人只需要通过音箱提供的公共接口,就能实现各种功能

UML.png

具体实现如下:

//电灯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();
}
             
//关闭功能同理,不再赘述

⭐优缺点

优点

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类
  • 对客户屏蔽了子组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易

缺点

  • 不符合开闭原则,修改很麻烦!