结构性模式

通过类和接口间的继承和引用关系船舰结构复杂的对象。

1 适配器模式

当需要将两个不同接口的类进行通信时,在不修改这两个类的前提下,我们可以用中间件完成衔接过程。这个中间件就是适配器,适配器模式就是将一个类的接口,转换为客户期望的另一个接口,让原本不兼容的接口完成无缝对接。

类适配器

通过类的继承实现适配,继承Target的接口,继承Adaptee的实现

image.png

对象适配器

通过类对象的组合实现适配

image.png

  • target:定义Client真正需要的接口。
  • Adaptee:其中定义了一个已经存在的接口,也就是我们需要进行适配的接口。
  • Adapter:对Adaptee和Target的接口进行适配,保证对target中接口的调用可以间接转换为对Adaptee中接口的调用。

优点:

  • 提高了类的复用
  • 组合若干关联对象对外提供统一服务接口
  • 扩展性、灵活性号

缺点:

过多使用适配器模式容易导致代码功能和逻辑意义混淆。

部分语言对继承的限制,可能至多只能适配一个适配者类么日期目标类必须是抽象类。

2 桥接模式

3 组合模式

4 装饰模式

5 外观模式

6 享元模式

7 代理模式

代理模式本质是一个中间件,主要目的时解耦合服务提供者和使用者。

使用者通过代理间接访问服务提供者,便于后者的封装和控制。

image.png

  • RealSubject:真正的目标对象
  • Proxy:目标对象的代理,负责控制和管理目标对象,并间接传递外部对目标对象的访问
    • Remote Proxy:对本地的请求以及参数进行序列化,向远程对象发送请求,并对响应结果进行反序列化,将最终结果反馈给调用者。
    • Virtual Proxy:当目标对象创建开销比较大时,可以使用延迟或者异步的方式创建目标对象
    • Protection Proxy:细化对目标对象访问权限的控制

静态代理和动态代理的区别

动态代理更加灵活,不需要必须实现接口,可以直接代理实现类,并且可以不需要整堆每个目标类都创建一个代理类。

静态代理中,一旦新增方法,目标对象和代理对象都要修改。

JVM中,静态代理在编译时就将接口、实现类、代理类编译成class文件,动态代理是在运行时动态生成字节码文件,加载到JVM中的。