🥫🍞

设计模式

2022-07-16

设计模式

参考

图解设计模式

1. Iterator 模式

2. Adapter 模式

Adapter 模式也被称为 Wrapper 模式。

Adapter 模式角色

  • Target

该角色负责定义所需的方法。

  • Adaptee(被适配者)

Adaptee 是一个持有既定方法的角色

  • Adapter(适配器)

Adapter 模式的主人公。使用 Adaptee 的方法来满足 Target 的需求。在类适配器模式中,Adapter 通过继承来使用 Adaptee;在对象适配器模式中,Adapter 通过委托来使用 Adaptee 角色。

适配器和被适配者并不需要继承相同的抽象类或接口。

如果在类适配器模式中,会让适配器实现被适配者,但似乎不如对象适配器的委托优雅。

例子

适配器 被适配者
InputStreamReader InputStream 系列
OutputStreamWriter OutputStream 系列
FutureTask Runnable

由于 InputStreamOutputStream 只能输入/输出字节,需要经过一个适配过程,将字节转换为字符,这就是适配器模式。

7. Abstract Factory 模式

父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责。

FileSystemProvider.newInputStream 用于生成文件 InputStream,底层依赖于 FileSystemProvider,可能是 WindowsFileSystem 也可能是 ZipFileSystem。类似 Abstract Factory 的变体。

11. Decorator 模式

装饰器(Decorator)模式 可以在不改变原有对象的情况下拓展其功能。

Decorator 模式中的角色

  • Component

增加功能时的核心角色

  • ConcreteComponent

实现了 Component 角色所定义的接口

  • Decorator

该角色具有与 Component 相同的接口,内部保存了被装饰的对象。

  • ConcreteDecorator

具体的 Decorator 角色

以 Java IO 库来说,InputStreamOutputStream 扮演 Component 角色。

FilterInputStreamFilterOutputStream 扮演 Decorator

对于字节流来说, FilterInputStream (对应输入流)和 FilterOutputStream(对应输出流)是装饰器模式的核心,分别用于增强 InputStreamOutputStream 子类对象的功能。

我们常见的 BufferedInputStreamDataInputStream 等等都是FilterInputStream 的子类,BufferedOutputStreamDataOutputStream 等等都是 FilterOutputStream 的子类。

BufferedInputStream 的构造器参数也可以知道,传入一个 InputStream 对象,进而装饰。

1
2
3
4
5
6
7
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}

21. Proxy 模式

Proxy 模式中的角色

在 Proxy 模式中一般有以下角色:

  • Subject(主体)

Subject 定义了使 Proxy 和 RealSubject 之间具有一致性的接口。

  • Proxy(代理人)

Proxy 会尽量处理来自外界的请求。当自己不能处理时,才会将工作交给 RealSubject。Proxy 也要实现 Subject 定义的接口。

  • RealSubject(实际主体)

RealSubject 会在 Proxy 无法胜任工作时出场。它也会实现 Subject 接口。

Proxy 模式变体

  • Virtual Proxy(虚拟代理)
    Virtual Proxy 就是上面呈现的 Proxy 模式。当真正需要 RealSubject 时,才生成和初始化实例。

  • Remote Proxy(远程代理)
    Remote Proxy 可以让我们不必在意 RealSubject 是否在远程网络上,透明地使用它的功能。Java 的 RMI(Remote Method Invocation:远程方法调用)就相当于 Remote Proxy。

  • Access Proxy
    Access Proxy 用于限制 RealSubject 的功能访问。例如,这种代理只允许访问特定的方法,当访问其他方法时则报错。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章