定义(百度百科):外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
UML类图:
具体代码:
public class Client { public static void main(String[] args) { SubSystemOne one = new SubSystemOne(); SubSystemTwo two = new SubSystemTwo(); System.out.println("原始方式开始"); one.methodOne(); two.methodTwo(); System.out.println("原始方式结束"); System.out.println("外观模式开始"); Facade facade = new FacadeImpl(one, two); facade.methodFacade(); System.out.println("外观模式结束"); } } public interface Facade { void methodFacade(); } public class FacadeImpl implements Facade { private SubSystemOne one; private SubSystemTwo two; FacadeImpl(SubSystemOne one, SubSystemTwo two) { this.one = one; this.two = two; } @Override public void methodFacade() { one.methodOne(); two.methodTwo(); } } public class SubSystemOne { public void methodOne() { System.out.println("SubSystemOne-methodOne"); } } public class SubSystemTwo { public void methodTwo() { System.out.println("SubSystemTwo-methodTwo"); } } 原始方式开始 SubSystemOne-methodOne SubSystemTwo-methodTwo 原始方式结束 外观模式开始 SubSystemOne-methodOne SubSystemTwo-methodTwo 外观模式结束
模块说明:
Facade:
客户端通过此角色能了解到子系统提供的功能,此角色会委派任务到相应的子系统中去
SubSystem:
子系统不是单独的类,而是类的集合。负责提供业务逻辑,对子系统来说Facade就是它的一个客户端
例子:
1.外观模式就相当于一体机,而原始的情况就相当于DIY组装机器。
2.编译器对于程序员来说就是外观模式,封装了编译的各个组件。
3.出去吃饭和自己买菜做饭,出去吃就是外观,全部交给服务员。而自己做的话就是一点点组装。
适用场景:
外观模式它通过引入一个外观角色来简化客户端与子系统之间的交互,
为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。
外观模式并不给系统增加任何新功能,它仅仅是简化调用接口。
优缺点:
优点:
松耦合
简单易用
更好的划分访问层次
缺点:
不能很好地限制客户端直接使用子系统类
如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则
总结:
封装复杂交互,使客户端调用变的简单。