1. 定义
外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更加容易使用。
外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可以包装很多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成新的需要的接口。
2. 类图
外观模式的主要目的是简化 子系统中较为复杂或者繁琐的方法调用,将所有方法调用集中到一个方法中,用户只需要和外观类交互即可,不需要知道组件中其他的方法和子对象,符合设计模式的“最少知道”原则。
3. 实现代码
外观类的代码实现,这是面对客户的入口
/*** Class Facade*/ public class Facade {//// Fields// private ClassA classA;private ClassB classB;private ClassC classC;//// Constructors// public Facade () { };//// Methods////// Accessor methods// /*** Set the value of classA* @param newVar the new value of classA*/private void setClassA (ClassA newVar) {classA = newVar;}/*** Get the value of classA* @return the value of classA*/private ClassA getClassA () {return classA;}/*** Set the value of classB* @param newVar the new value of classB*/private void setClassB (ClassB newVar) {classB = newVar;} /*** Get the value of classB* @return the value of classB*/private ClassB getClassB () {return classB;}/*** Set the value of classC* @param newVar the new value of classC*/private void setClassC (ClassC newVar) {classC = newVar;}/*** Get the value of classC* @return the value of classC*/private ClassC getClassC () {return classC;}//// Other methods// /***/public void actionAB(){classA.actionA();classB.actionB();}/***/public void actionAC(){classA.actionA();classC.actionC();}/***/public void actionABC(){classA.actionA();classB.actionB();classC.actionC();} }
这是外观类持有的子对象,也是子系统的内部对象
/*** Class ClassA*/ public class ClassA {//// Constructors// public ClassA () { };/***/public void actionA(){}}
ClassB, ClassC 的代码类似ClassA的代码,此处不做展示。
4. 优势、劣势
- 客户调用系统不需要繁琐、冗长的代码;
- 客户不需要知道内部支持的各个步骤,只知道外观类的某个方法可以实现用户的某个目的,通过这样后期改造方法也会变得相对简单;
------------------------
- 代码中需要多出外观类的代码
- 不符合开闭原则,需要修改的时候,需要改动外观类代码
- 对于需要经常定制化调用子组件的各种行为、方法的话,外观类并不适合,这时候应该暴露子类的访问接口供客户使用
5. 应用场景
1. 为复杂的模块或子系统提供外界访问的模块。
2. 子系统相对独立。
3. 预防低水平人员带来的风险。