设计模式之一致性
1.Composite模式
Composite(组合)模式适用于将对象组织为树形结构的一种设计模式,使得树中节点具有一致性,一致性可以理解为指父节点和子节点的api完全相同(使用完全一致性),进而创造出递归结构。文件系统就是一种典型的树形结构。
示例代码:列出文件夹和文件的内容。
名字 | 说明 |
---|---|
Entry | 抽象类,用来实现File和Directory类的一致性 |
File | 表示文件的类 |
Directory | 表示文件夹的类 |
1 | public abstract class Entry { |
1 | public class File extends Entry{ |
1 | import java.util.ArrayList; |
Main类:
1 | public class EntryTest { |
输出:
1 | /root (99) |
2.Decorator模式
装饰器(Decorator)模式 可以在不改变原有对象的情况下拓展其功能。装饰器模式通过组合替代继承来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用。在装饰器模式中,被装饰物和装饰物具有一致性,他们具有相同的接口api,装饰物和被装饰物接口上有透明性。装饰器包含与目标对象相同的一系列方法, 它会将所有接收到的请求委派给目标对象。 但是, 装饰器可以在将请求委派给目标前后对其进行处理, 所以可能会改变最终结果。装饰物和被装饰物接口的一致性,可以无限套娃。
对于字节流来说, FilterInputStream
(对应输入流)和 FilterOutputStream
(对应输出流)是装饰器模式的核心,分别用于增强 InputStream
和 OutputStream
子类对象的功能。
我们常见的 BufferedInputStream
(字节缓冲输入流)、DataInputStream
等等都是 FilterInputStream
的子类,BufferedOutputStream
(字节缓冲输出流)、DataOutputStream
等等都是 FilterOutputStream
的子类。
举个例子,我们可以通过 BufferedInputStream
(字节缓冲输入流)来增强 FileInputStream
的功能。
- InputStream 是抽象组件;
- FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作;
- FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能。例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。
- 实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。
著作权归@pdai所有
原文链接:https://pdai.tech/md/java/io/java-io-basic-design-pattern.html
InputStream是一个抽象类,内部有一个read的抽象方法。FilterInputStream继承了InputStream,内部一个protected volatile InputStream in属性。
如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。
装饰能将业务逻辑组织为层次结构, 你可为各层创建一个装饰, 在运行时将各种不同逻辑组合成对象。 由于这些对象都遵循通用接口, 客户端代码能以相同的方式使用这些对象。
如果用继承来扩展对象行为的方案难以实现或者根本不可行, 你可以使用该模式。
许多编程语言使用 final最终关键字来限制对某个类的进一步扩展。 复用最终类已有行为的唯一方法是使用装饰模式: 用封装器对其进行封装。