结构型设计模式——外观模式

摘要

本文主要分析设计模式 - 结构型 - 外观(Facade),它提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。

一、外观模式的意图

外观模式 (Facade) 是一种结构型设计模式, 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  • 外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。
  • 外观模式实现了子系统与客户之间的松耦合关系。
  • 外观模式没有封装子系统的类,只是提供了简单的接口。 如果应用需要,它并不限制客户使用子系统类。因此可以再系统易用性与通用性之间选择。
  • 外观模式注重的是简化接口,它更多的时候是从架构的层次去看整个系统,而并非单个类的层次。

二、外观模式的场景

  • 如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。
  • 如果需要将子系统组织为多层结构, 可以使用外观。

三、外观模式的类图

  1. 外观 (Facade) 提供了一种访问特定子系统功能的便捷方式, 其了解如何重定向客户端请求, 知晓如何操作一切活动部件。

  2. 创建附加外观 (Additional Facade) 类可以避免多种不相关的功能污染单一外观, 使其变成又一个复杂结构。 客户端和其他外观都可使用附加外观。

  3. 复杂子系统 (Complex Subsystem) 由数十个不同对象构成。 如果要用这些对象完成有意义的工作, 你必须深入了解子系统的实现细节, 比如按照正确顺序初始化对象和为其提供正确格式的数据。子系统类不会意识到外观的存在, 它们在系统内运作并且相互之间可直接进行交互。

  4. 客户端 (Client) 使用外观代替对子系统对象的直接调用。

四、外观模式的实现

Facade : 了解每个子系统类的功能,负责分发客户端的请求给各个子系统去处理。

java 复制代码
class Class1 {
    public void op1() {
        System.out.println("方法1");
    }
}

class Class2 {
    public void op2() {
        System.out.println("方法2");
    }
}

class Class3 {
    public void op3() {
        System.out.println("方法3");
    }
}

Subsystem Classes : 实现子系统功能。在不感知 Facade 的情况下,处理 Facade 对象分配的工作

java 复制代码
class Facade {
    private Class1 one = new Class1();
    private Class2 two = new Class2();
    private Class3 three = new Class3();

    public void op1() {
        System.out.println("Facade op1()");
        one.op1();
    }

    public void op2() {
        System.out.println("Facade op2()");
        two.op2();
    }

    public void op3() {
        System.out.println("Facade op3()");
        three.op3();
    }

    public void Method() {
        System.out.println("Facade Method()");
        three.op3();
        two.op2();
        one.op1();
    }
}
java 复制代码
public class FacadePattern {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.Method();

        facade.op1();
    }
}


----------------------------------
Facade Method()
方法3
方法2
方法1
Facade op1()
方法1

五、外观模式的开源示例

六、外观模式的总结

  • 最少知识原则: 只和你的密友谈话。也就是说客户对象所需要交互的对象应当尽可能少。
  • 外观模式为现有对象定义了一个新接口,适配器模式则会试图运用已有的接口。适配器通常只封装一个对象,外观通常会作用于整个对象子系统上。
  • 当只需对客户端代码隐藏子系统创建对象的方式时,你可以使用抽象工厂模式来代替外观i。享元模式展示了如何生成大量的小型对象,外观则展示了如何用一个对象来代表整个子系统。外观和中介者模式的职责类似:它们都尝试在大量紧密耦合的类中组织起合作。
  • 外观为子系统中的所有对象定义了一个简单接口,但是它不提供任何新功能。子系统本身不会意识到外观的存在。子系统中的对象可以直接进行交流。
  • 中介者将系统中组件的沟通行为中心化。各组件只知道中介者对象,无法直接相互交流。外观类通常可以转换为单例模式类,因为在大部分情况下一个外观对象就足够了。
  • 外观与代理模式?的相似之处在于它们都缓存了一个复杂实体并自行对其进行初始化。代理与其服务对象遵循同-接口,使得自己和服务对象可以互换,在这一点上它与外观不同。

博文参考

设计模式之外观模式 | DESIGN

结构型 - 外观(Facade) | Java 全栈知识体系

相关推荐
on the way 12312 小时前
结构性设计模式之Flyweight(享元)
java·设计模式·享元模式
暴躁哥16 小时前
深入理解设计模式之访问者模式
设计模式·访问者模式
佩奇的技术笔记17 小时前
从Java的JDK源码中学设计模式之装饰器模式
java·设计模式·装饰器模式
on the way 12317 小时前
结构型设计模式之Proxy(代理)
设计模式·代理模式
YGGP20 小时前
【结构型模式】装饰器模式
设计模式
将编程培养成爱好1 天前
《复制粘贴的奇迹:小明的原型工厂》
c++·设计模式·原型模式
liang_jy1 天前
设计模式中的几大原则
设计模式·面试
huangyujun99201231 天前
设计模式杂谈-模板设计模式
java·设计模式
magic 2451 天前
Java设计模式:责任链模式
java·设计模式·责任链模式
YGGP1 天前
【结构型模式】代理模式
设计模式