1.外观模式定义
为子系统中的一组接口提供统一的接口,它定义了一个更高级别的接口,使得子系统更易于使用;相当于公司部门之间通过代表来沟通,这样减少无效、复杂的沟通;
1.1 外观模式的优缺点
优点:
- 他对客户端屏蔽了子系统组件,减少了客户端所需要处理的对象数,并使子系统使用起来更容易,通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少;
- 它实现了子系统与客户端之间的松耦合,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可;
- 一个子系统的修改对其他子系统没有任何影响,而子系统内部变化也不会影响到外观对象;
缺点:
- 不能很好的控制客户端直接使用子系统类,如果客户端访问子系统类做太多的限制,则减少了可变性与灵活性;
- 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则;
1.2 外观模式的使用场景
- 简化复杂系统;
- 减少客户端处理的系统数量,如web应用中的dao层,专门用来操作数据库;
- 让一个系统(对象)为多个系统(对象)工作,如线程池;
- 联合更多的系统来扩展原有系统;
2.外观模式的原理
- 外观类(Facade):为多个子系统对外提供一个共同的接口;
- 子系统类(SUbSystem):实现系统的部分功能,客户可以通过外观角色访问它;
3.外观模式的实现
【实例】
智能家居
【代码】
子系统类
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 SmartAppliancesFacade {
private Light light;
private TV tv;
public SmartAppliancesFacade() {
this.light =new Light();
this.tv = new TV();
}
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();
}
}
客户端
//创建外观对象
SmartAppliancesFacade facade = new SmartAppliancesFacade();
facade.say("打开家电");
facade.say("关闭家电");