外观模式概述
在日常生活中,在家自己做饭吃和到饭店吃饭,最大的不同其实是在于到饭店吃饭你不需要考虑如何把菜做出来,不需要考虑先煮熟再炸还是直接炸熟,只需要吃就可以了,饭店帮我们完成了其他要做的工作,这个情景就是外观模式的体现.
示例
到茶馆喝茶,主要的步骤有洗杯子,洗茶叶,煮水,泡茶等,而这些操作都由茶馆的服务员提供,而我们做的只是喝茶.用外观模式实现该过程
UML图

示例解析
考虑到拓展能力,所以将功能(drinkTea)抽象出来,具体子类在实现父类方法的时候加入各个操作(operator1,2,3,4)
示例代码
抽象类
public abstract class AbstractOperatorFacade {
public abstract void drinkTea(String teaName);
}
功能类
public class Operator1 {
public void washCup(){
System.out.println("洗杯子");
}
}
public class Operator2 {
public void washTea() {
System.out.println("洗茶叶");
}
}
public class Operator3 {
public void BoiledWater(){
System.out.println("煮水");
}
}
public class Operator4 {
public void makeTea(){
System.out.println("泡茶");
}
}
具体子类
public class OperatorFacade extends AbstractOperatorFacade {
private Operator1 operator1;
private Operator2 operator2;
private Operator3 operator3;
private Operator4 operator4;
public OperatorFacade() {
operator1 = new Operator1();
operator2 = new Operator2();
operator3 = new Operator3();
operator4 = new Operator4();
}
@Override
public void drinkTea(String teaName) {
operator1.washCup();
operator2.washTea();
operator3.BoiledWater();
operator4.makeTea();
System.out.println(teaName + "泡好了");
}
}
调用
AbstractOperatorFacade abstractOperatorFacade = new OperatorFacade();
abstractOperatorFacade.drinkTea("乌龙");
输出
洗杯子
洗茶叶
煮水
泡茶
乌龙泡好了
外观模式优缺点
优点
- 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。
- 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
- 一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
缺点
- 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活 性。
- 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
适用场景
- 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
- 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
网友评论