Java第十六天(四)
设计模式——装饰者
目的:将类的功能进行增强。
使用继承方式实现将类的功能增强:
举例:在写入文件时的增强
我们有一个Writers类去写入文件,并且这个类有三个子类分别是:TxtWriter、Mp3Writer与Mp4Writer。
在Writers类中,我们定义了写文件的标准方法,并由三个子类去分别去实现这个方法。
再创建者三个子类的子类,用于给相对应的父类添加高效缓冲区方法。
Writers类
public abstract class Writers {
/**
* 定义写文件的标准抽象方法writeFile
*/
public abstract void writeFile();
}
TxtWriter子类
public class TxtWriter extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Txt文件!");
}
}
Mp3Writer子类
public class Mp3Writer extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Mp3文件!");
}
}
Mp4Writer子类
public class Mp4Writer extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Mp4文件!");
}
}
BufferedTxtWriter子类
/**
* 使用继承方式对TxtWriter类进行增强
*/
public class BufferedTxtWriter extends TxtWriter {
private TxtWriter tw;
//这是一个含参构造器,用于接收在测试类中传入的对象
public BufferedTxtWriter(TxtWriter txtWriter) {
this.tw = txtWriter;
}
/**
* 这里重写了父类writeFile方法
*/
@Override
public void writeFile() {
// 调用高效缓冲区方法,来加入高效缓冲区
bufferedWriteFile();
// 这里调用父类写入文件的方法
tw.writeFile();
}
// 定义写入方法的高效缓冲区方法来进行增强
public void bufferedWriteFile() {
System.out.println("在TxtWriter类中加入高效缓冲区!");
}
}
BufferedMp3Writer子类
/**
* 使用继承方式对Mp3Writer类进行增强
*/
public class BufferedMp3Writer extends Mp3Writer {
private Mp3Writer mw3;
//这是一个含参构造器,用于接收在测试类中传入的对象
public BufferedMp3Writer(Mp3Writer mp3Writer) {
this.mw3 = mp3Writer;
}
/**
* 这里重写了父类writeFile方法
*/
@Override
public void writeFile() {
// 调用高效缓冲区方法,来加入高效缓冲区
bufferedWriteFile();
// 这里调用父类写入文件的方法
mw3.writeFile();
}
// 定义写入方法的高效缓冲区方法来进行增强
public void bufferedWriteFile() {
System.out.println("在Mp3Writer类中加入高效缓冲区!");
}
}
BufferedMp4Writer子类
/**
* 使用继承方式对Mp4Writer类进行增强
*/
public class BufferedMp4Writer extends Mp4Writer {
private Mp4Writer mw4;
//这是一个含参构造器,用于接收在测试类中传入的对象
public BufferedMp4Writer(Mp4Writer mp4Writer) {
this.mw4 = mp4Writer;
}
/**
* 这里重写了父类writeFile方法
*/
@Override
public void writeFile() {
// 调用高效缓冲区方法,来加入高效缓冲区
bufferedWriteFile();
// 这里调用父类写入文件的方法
mw4.writeFile();
}
// 定义写入方法的高效缓冲区方法来进行增强
public void bufferedWriteFile() {
System.out.println("在Mp4Writer类中加入高效缓冲区!");
}
}
测试类
public class WriteTest {
public static void main(String[] args) {
//使用多态创建Writer对象
Writers writers = new BufferedTxtWriter(new TxtWriter());
Writers writers1 = new BufferedMp3Writer(new Mp3Writer());
writers.writeFile();
writers1.writeFile();
}
}
上述代码我们可以得出,当使用继承方式来增强类时的结构为:
|——TxtWriter
|——Mp3Writer
|——Mp4Writer
使用继承方式加入高效缓冲区的结构为:
|——TxtWriter
|——BufferedTxtWriter
|——Mp3Writer
|——BufferedMp3Writer
|——Mp4Writer
|——BufferedMp4Writer
也就是说当我们如果想继续添加写文件的子类并且对他做增强时,还需要创建相应的高效缓冲区类及方法。
使用装饰器方式实现将类的功能增强:
用上面的例子来说,使用装饰器的方式可以解决使用高效缓冲区时创建相应的高效缓冲区类及方法(不需要每一个Writes的子类都添加高效缓冲区的子类)。
如果Writes的子类以同样的方式添加高效和缓冲区,我们则可以将缓冲区抽象出来作为装饰器。
角色:
1.抽象构建角色(定义写文件标准类):Writers
2.具体的构件角色(实现写文件标准类):TxtWriter、Mp3Writer与Mp4Writer
3.装饰角色(高效缓冲区类)
Writers类
public abstract class Writers {
/**
* 定义写文件的标准抽象方法writeFile
*/
public abstract void writeFile();
}
TxtWriter子类
public class TxtWriter extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Txt文件!");
}
}
Mp3Writer子类
public class Mp3Writer extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Mp3文件!");
}
}
Mp4Writer子类
public class Mp4Writer extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Mp4文件!");
}
}
BufferedWriteFile类
/**
* 创建装饰角色(高效缓冲区)
*/
public class BufferedWriteFile extends Writers {
private Writers writers;
// 定义一个含参的构造器,以多态的方式接收传入的对象
public BufferedWriteFile(Writers writers) {
this.writers = writers;
}
@Override
public void writeFile() {
this.bufferedWrite();
writers.writeFile();
}
// 定义写入方法的高效缓冲区方法来进行增强
public void bufferedWrite() {
System.out.println("加入高效缓冲区!");
}
}
测试类
public class WriteTest {
public static void main(String[] args) {
//使用多态创建Writer对象
Writers writers = new BufferedWriteFile(new TxtWriter());
Writers writers1 = new BufferedWriteFile(new Mp3Writer());
writers.writeFile();
writers1.writeFile();
}
}
扩展
当装饰角色无法满足现有需求时,可以进行二次增强。
1.抽象构建角色(定义写文件标准类):Writers
2.具体的构件角色(实现写文件标准类):ZipWriter、RarWriter
3.装饰角色(高效缓冲区类)
4.具体装饰角色
Writers类
public abstract class Writers {
/**
* 定义写文件的标准抽象方法writeFile
*/
public abstract void writeFile();
}
ZipWriter
public class ZipWriter extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入压缩文件!");
}
}
RarWriter
public class RarWriter extends Writers {
/**
* 实现父类中的writeFile抽象方法
*/
@Override
public void writeFile() {
System.out.println("写入Rar文件!");
}
}
BufferedWriteFile类(装饰角色)
/**
* 创建抽象装饰角色(高效缓冲区)
*/
public class BufferedWriteFile extends Writers {
private Writers writers;
// 定义一个含参的构造器,以多态的方式接收传入的对象
public BufferedWriteFile(Writers writers) {
this.writers = writers;
}
@Override
public void writeFile() {
this.bufferedWrite();
writers.writeFile();
}
// 定义写入方法的高效缓冲区方法来进行增强
public void bufferedWrite() {
System.out.println("加入高效缓冲区!");
}
// 定义清理方法
public void clean() {}
}
BufferedWriteZipFile类(具体装饰角色)
public class BufferedWriteZipFile extends BufferedWriteFile {
private Writers writers;
public BufferedWriteZipFile(Writers writers) {
super(writers);
}
@Override
public void writeFile() {
super.writeFile();
this.clean();
}
public void clean(){
System.out.println("开始清理!");
}
}
测试类
public class WriteTest {
public static void main(String[] args) {
//使用多态创建Writer对象
Writers writers = new BufferedWriteZipFile(new ZipWriter());
Writers writers1 = new BufferedWriteZipFile(new RarWriter());
writers.writeFile();
writers1.writeFile();
}
}
使用抽象装饰器方式实现将类的功能增强:
与上面装饰器不同的是:
角色:
1.抽象构建角色(定义写文件标准类):Writers
2.具体的构件角色(实现写文件标准类):TxtWriter、Mp3Writer与Mp4Writer
3.装饰角色【抽象】(高效缓冲区抽象类)
4.具体的装饰角色:实现抽象装饰器中的增强方法。
BufferedWriteFile抽象类
/**
* 创建抽象装饰角色(高效缓冲区)
*/
public abstract class BufferedWriteFile extends Writers {
private Writers writers;
// 定义一个含参的构造器,以多态的方式接收传入的对象
public BufferedWriteFile(Writers writers) {
this.writers = writers;
}
@Override
public void writeFile() {
this.bufferedWrite();
writers.writeFile();
this.clean();
}
// 定义抽象写入方法的高效缓冲区方法来进行增强
public abstract void bufferedWrite();
// 定义抽象清理方法
public abstract void clean();
}
BufferedWriteFile实现类
/**
*BufferedWriteFile实现类
*/
public class BufferedWriteFileImpl extends BufferedWriteFile{
public BufferedWriteFileImpl(Writers writers) {
super(writers);
}
@Override
public void bufferedWrite() {
System.out.println("加入高效缓冲区!");
}
@Override
public void clean() {
System.out.println("开始清理!");
}
}
测试类
public class WriteTest {
public static void main(String[] args) {
//使用多态创建Writer对象
Writers writers = new BufferedWriteFileImpl(new TxtWriter());
Writers writers1 = new BufferedWriteFileImpl(new Mp3Writer());
writers.writeFile();
writers1.writeFile();
}
}
本文深入探讨了Java设计模式中的装饰者模式,通过实例详细解释了如何使用该模式增强类的功能,包括使用继承、装饰器及抽象装饰器三种方式。通过代码示例,展示了装饰者模式如何避免过多子类的创建,同时保持代码的灵活性和扩展性。

被折叠的 条评论
为什么被折叠?



