定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。

外观模式代码:

 /// <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();
        }
    }
View Code

外观的优缺点

优点:

  1. 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
  2. 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。

缺点:

  1. 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。

使用场景

 在以下情况下可以考虑使用外观模式:

  • 外一个复杂的子系统提供一个简单的接口
  • 提供子系统的独立性
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子