装饰器模式
参考文章:
《软件设计模式概述》
《设计模式之美》——极客时间·王争
一、概念
我们有一个文件读取功能,可以读取磁盘上的文本类文件、音乐类文件以及视频类文件。
后来,我们觉得读取速度很慢,与磁盘交互太多,想将现有的读取功能增强,增加缓冲区。
FileRead功能(Old) | FileRead功能(New) |
---|---|
这种改进措施有很大弊端,复用性很低,需要改进。
改进后结构图 | |
---|---|
装饰器模式结构图(简约版) |
装饰器设计模式:
通过创建一个包装对象,也就是装饰来包裹真实的对象,从而增强一个类的功能
角色说明:
1、Component 是统一接口,也是装饰类和被装饰类的基本类型
2、ConreteComponent 是具体实现类,也是被装饰类,本身就是个具有一些功能的完整类
3、ConcreteDecorator是具体的装饰产品类,实现了Component接口的同时还在内部维护了一个Component实例,通过构造函数初始化,每一种装饰产品都具有特定的装饰效果,可以通过构造器来声明装饰哪种类型Component,从而对其装饰。
//ReadFile抽象类
public abstract class FileRead {
public abstract void read();
}
//读取文本文件类
public class FileTextRead extends FileRead {
String name = "文本";
@Override
public void read() {
System.out.println(name + "文件直接读取.....");
}
}
//读取音乐文件类
public class FileMusicRead extends FileRead {
String name = "音乐";
@Override
public void read() {
System.out.println(name + "文件直接读取.......");
}
}
//读取视频文件类
public class FileVedioRead extends FileRead {
String name = "视频";
@Override
public void read() {
System.out.println(name + "文件直接读取,......");
}
}
/**
* 缓冲类,同样继承ReadFile类,但是里面创建了父类对象,可以传入其三个子类对象
* 实现了三个子类各自功能的同时还增加了缓冲机制
*/
public class BufferdFileRead extends FileRead {
private FileRead fileRead;
//这里会实现多态
public BufferdFileRead(FileRead fileRead) {
this.fileRead = fileRead;
}
@Override
public void read() {
//这个read方法是缓冲类自己的read
//这个read是传入的FileRead类对象或者其子类对象的read方法
fileRead.read();
System.out.println("缓存。。。。。");
}
}
//测试
public class test {
public static void