装饰者模式作用:增强类的功能,使用方法分为两步: 第一步:定义抽象构件 第二步:定义定义具体构件,实现抽象构件,根据需求向具体构件中添加增强的方法
范例:针对.MP3、.Txt、.Avi格式写入相应的文件,并添加高速缓冲区,两种方法对比:
第一种,使用类继承
缺点:增加一个类时,需要重写增强的方法,不能体现代码的复用性
//测试类
public class Client {
public static void main(String[] args) {
Writer writer=new BufferedTXTWriter(new TXTWriter());
writer.writerFile();
Writer writer1=new BufferedMP3Writer(new MP3Writer());
writer1.writerFile();
}
}
/*输出:
加入高速缓冲区
写入MP3文件
加入高速缓冲区
写入文本文件*/
//分类,下面有三个子类
package io.extendss.writer;
public abstract class Writer {
public abstract void writerFile();;
}
package io.extendss.writer;
public class TXTWriter extends Writer {
@Override
public void writerFile() {
System.out.println("写入文本文件");
}
}
package io.extendss.writer;
public class MP3Writer extends Writer {
@Override
public void writerFile() {
System.out.println("写入MP3文件");
}
}
package io.extendss.writer;
public class AVIWriter extends Writer {
@Override
public void writerFile() {
System.out.println("写入视频文件");
}
}
//对TXtWriter方法进行增强
package io.extendss.writer;
//对输出文本文件方法加入高速缓冲区
public class BufferedTXTWriter extends TXTWriter {
private TXTWriter tw;
public BufferedTXTWriter(TXTWriter txtWriter) {
this.tw=txtWriter;
}
public void writerFile() {
bufferedWriter();
tw.writerFile();
}
public void bufferedWriter() {
System.out.println("加入高速缓冲区");
}
}
public class BufferedMP3Writer extends TXTWriter {
private MP3Writer mw;
public BufferedMP3Writer(MP3Writer mw) {
super();
this.mw = mw;
}
public void writerFile() {
bufferedMP3Writer();
mw.writerFile();
}
public void bufferedMP3Writer() {
System.out.println("加入高速缓冲区");
}
}
使用装饰着模式对写文件进行增强
//测试类
public class Client {
public static void main(String[] args) {
BufferedWriterFile writer=new BufferedWriterFile(new MP3Writer());
writer.writerFile();
BufferedTXTWriter writer1=new BufferedTXTWriter(new TXTWriter());
writer1.writerFile();
}
}
/*输出:
加入高速缓冲区
写入MP3文件
加入高速缓冲区
写入文本文件*/
//分类,下面有三个子类
package io.extendss.writer;
public abstract class Writer {
public abstract void writerFile();;
}
package io.extendss.writer;
public class TXTWriter extends Writer {
@Override
public void writerFile() {
System.out.println("写入文本文件");
}
}
package io.extendss.writer;
public class MP3Writer extends Writer {
@Override
public void writerFile() {
System.out.println("写入MP3文件");
}
}
package io.extendss.writer;
public class AVIWriter extends Writer {
@Override
public void writerFile() {
System.out.println("写入视频文件");
}
}
```javascript
package io.extendss.writer2;
import io.extendss.writer.Writer;
//通用化的高速缓冲区,这里不能继承具体的构件类,因为具体的构件类继承抽象构件
//类,高速缓冲流只需要继承抽象构件类,每个具体构建即可调用该方法
public class BufferedWriterFile extends Writer {
private Writer writer;
//这里使用多态,根据传过来的数据类型,决定调用哪个方法
public BufferedWriterFile(Writer writer) {
this.writer = writer;
}
@Override
public void writerFile() {
this.bufferedWriter();
writer.writerFile();
}
public void bufferedWriter() {
System.out.println("加入高速缓冲区");
}
}