设计模式——外观模式
- 1.问题抛出
- 2.定义
- 3.代码实现
- 3.1 类图
- 3.2 代码
- 4.总结
1.问题抛出
小明的爷爷已经60岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;操作起来都比较麻烦。所以小明给爷爷买了智能音箱,可以通过语音直接控制这些智能家电的开启和关闭。
2.定义
- 外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
- 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节
3.代码实现
3.1 类图
3.2 代码
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("关闭了空调....");}
}
facade
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {this.light = new Light();this.tv = new TV();this.airCondition = new AirCondition();}public void say(String message) {if ("打开".equals(message)) {on();} else if ("关闭".equals(message)) {off();} else {throw new UnsupportedOperationException();}}private void on() {System.out.println("起床了");light.on();tv.on();airCondition.on();}private void off() {System.out.println("睡觉了");light.off();tv.off();airCondition.off();}
}
调用类
public class Client {public static void main(String[] args) {SmartAppliancesFacade smartAppliancesFacade = new SmartAppliancesFacade();smartAppliancesFacade.say("打开");smartAppliancesFacade.say("关闭");}
}
结果输出
起床了
打开了灯....
打开了电视....
打开了空调....
睡觉了
关闭了灯....
关闭了电视....
关闭了空调....
4.总结
- 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
- 外观模式对客户端与子系统的耦合关系-解耦,让子系统内部的模块更易维护和扩展
- 通过合理的使用外观模式,可以帮我们更好的划分访问的层次
- 当系统需要进行分层设计时,可以考虑使用Facade 模式
- 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性
- 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。