装饰着模式Java23种设计模式之一

装饰者模式作用:增强类的功能,使用方法分为两步: 第一步:定义抽象构件 第二步:定义定义具体构件,实现抽象构件,根据需求向具体构件中添加增强的方法

范例:针对.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("加入高速缓冲区");
	}

}
发布了36 篇原创文章 · 获赞 50 · 访问量 9765

猜你喜欢

转载自blog.csdn.net/qq_41765969/article/details/90082575