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. 预防低水平人员带来的风险。