文章目录
- 概述
- 结构
- 案例实现
- 优缺点
概述
外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
举个例子,在没有只能家居的时候,我们开灯,开空调,开电视等等一系列操作,都需要我们一件一件来完成;在有了智能家居以后,在智慧生活设定指定的程序,就可以实现一键开启指定的家居。
结构
外观(Facade
)模式包含以下主要角色:
- 外观(
Facade
)角色: 为多个子系统对外提供一个共同的接口。 - 子系统(
Sub System
)角色: 实现系统的部分功能,客户可以通过外观角色访问它。
案例实现
以我们熟知的智能家居为例:
智能音箱就相当于我们的外观类,而家居就相当于一个一个的系统,只需要操作智能音箱就可以实现所有家电的开关。
子系统【电灯、电视、空调】:
//电灯类
public class Light {public void on() {System.out.println("打开电灯....");}public void off() {System.out.println("关闭电灯....");}
}//电视类
public class TV {public void on() {System.out.println("打开电视....");}public void off() {System.out.println("关闭电视....");}
}//空调类
public class AirCondition {public void on() {System.out.println("打开空调....");}public void off() {System.out.println("关闭空调....");}
}
外观类【智能音箱】:
//智能音箱类
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();}
}
测试:
public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say("打开");System.out.println("================");facade.say("关闭");}
}
优缺点
优点:
- 简化了调用过程,无需了解深入子系统,防止带来风险;
- 减少系统依赖、松散耦合,外观模式讲客户端和子系统之间进行解耦;
- 更好的划分访问层次;
- 符合迪米特法则,即最少知道原则。
缺点:
- 增加子系统、扩展子系统行为容易引入风险;
- 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。