设计模式
参考
图解设计模式
1. Iterator 模式
2. Adapter 模式
Adapter 模式也被称为 Wrapper 模式。
Adapter 模式角色
- Target
该角色负责定义所需的方法。
- Adaptee(被适配者)
Adaptee 是一个持有既定方法的角色
- Adapter(适配器)
Adapter 模式的主人公。使用 Adaptee 的方法来满足 Target 的需求。在类适配器模式中,Adapter 通过继承来使用 Adaptee;在对象适配器模式中,Adapter 通过委托来使用 Adaptee 角色。
适配器和被适配者并不需要继承相同的抽象类或接口。
如果在类适配器模式中,会让适配器实现被适配者,但似乎不如对象适配器的委托优雅。
例子
适配器 | 被适配者 |
---|---|
InputStreamReader |
InputStream 系列 |
OutputStreamWriter |
OutputStream 系列 |
FutureTask |
Runnable |
由于
InputStream
和OutputStream
只能输入/输出字节,需要经过一个适配过程,将字节转换为字符,这就是适配器模式。
7. Abstract Factory 模式
父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责。
FileSystemProvider.newInputStream
用于生成文件 InputStream
,底层依赖于 FileSystemProvider
,可能是 WindowsFileSystem
也可能是 ZipFileSystem
。类似 Abstract Factory
的变体。
11. Decorator 模式
装饰器(Decorator)模式 可以在不改变原有对象的情况下拓展其功能。
Decorator 模式中的角色
- Component
增加功能时的核心角色
- ConcreteComponent
实现了 Component 角色所定义的接口
- Decorator
该角色具有与 Component 相同的接口,内部保存了被装饰的对象。
- ConcreteDecorator
具体的 Decorator 角色
以 Java IO 库来说,InputStream
和 OutputStream
扮演 Component 角色。
FilterInputStream
和 FilterOutputStream
扮演 Decorator
对于字节流来说, FilterInputStream
(对应输入流)和 FilterOutputStream
(对应输出流)是装饰器模式的核心,分别用于增强 InputStream
和OutputStream
子类对象的功能。
我们常见的 BufferedInputStream
、DataInputStream
等等都是FilterInputStream
的子类,BufferedOutputStream
、DataOutputStream
等等都是 FilterOutputStream
的子类。
从 BufferedInputStream
的构造器参数也可以知道,传入一个 InputStream
对象,进而装饰。
1 | public BufferedInputStream(InputStream in, int 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 的功能访问。例如,这种代理只允许访问特定的方法,当访问其他方法时则报错。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章