设计模式(八):装饰模式
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码
一般有两种方式可以实现给一个类或对象增加行为:
装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”,它是一种对象结构型模式。
装饰模式包含如下角色:
这里我们的用例场景是,在读取的时候,我们需要在这之前增加一些业务逻辑:
读取的接口:
package cn.edu.hust.decorator;
public interface InputStream {
void read(byte[] bytes);
}一般的文件读取类,这个类只是简单的读取一下:
package cn.edu.hust.decorator;
public class FileInputStream implements InputStream {
//简单的读取字节
public void read(byte[] bytes) {
System.out.println(new String(bytes));
}
}假设我们需要在读取之前增加一些业务逻辑,我们使用一个装饰器类来实现
package cn.edu.hust.decorator;
public class StringInputStream implements InputStream {
private InputStream inputStream;
public StringInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public void read(byte[] bytes) {
inputStream.read(bytes);
}
}具体的装饰器类
package cn.edu.hust.decorator;
public class StringBufferInputStream extends StringInputStream
{
private InputStream inputStream;
public StringBufferInputStream(InputStream inputStream) {
super(inputStream);
}
//这里在读取字符串之前输入一些内容
@Override
public void read(byte[] bytes) {
System.out.println("这里是增强的方法。。。");
super.read(bytes);
}
}客户端的使用:
package cn.edu.hust.decorator;
public class Client {
public static void main(String[] args)
{
InputStream inputStream=new FileInputStream();
StringBufferInputStream stringBufferInputStream=new StringBufferInputStream(inputStream);
stringBufferInputStream.read("这是一个文件".getBytes());
}
}装饰模式的优点:
装饰模式的缺点:
在以下情况下可以使用装饰模式:
原文链接:https://github.com/oeljeklaus-you/Design-Patterns/blob/master/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F(%E5%85%AB)%E8%A3%85%E9%A5%B0%E6%A8%A1%E5%BC%8F.md