定义
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。
外观模式代码:
/// <summary> /// 子系统A /// </summary> public class ClassA { public void doSomethingA() { //业务逻辑 } } /// <summary> /// 子系统B /// </summary> public class ClassB { public void doSomethingB() { //业务逻辑 } } /// <summary> /// 子系统C /// </summary> public class ClassC { public void doSomethingC() { //业务逻辑 } } /// <summary> /// 门面对象 /// </summary> public class Facade { private ClassA a = new ClassA(); private ClassB b = new ClassB(); private ClassC c = new ClassC(); //提供给外部访问的方法 public void mothodA() { this.a.doSomethingA(); } public void mothodB() { this.b.doSomethingB(); } public void mothodC() { this.c.doSomethingC(); } }
外观的优缺点
优点:
- 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
- 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
缺点:
- 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。
使用场景
在以下情况下可以考虑使用外观模式:
- 外一个复杂的子系统提供一个简单的接口
- 提供子系统的独立性
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子。