设计模式-装饰者模式

本文介绍装饰者模式的设计理念,即不修改原有类的基础上为其增加功能。通过Java流体系的实例,展示如何使用装饰者模式实现缓存流,遵循对修改关闭、对扩展开放的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰者模式定义:

动态的为一个对象增加额外的功能。

what?啥意思。。? 其实还是遵循那个原则,对修改关闭,对扩展开放。如果要给一个类增加额外的功能,不要去修改他的代码,而是通过其他类持有它的引用,在功能前后增加所要增加的功能即可。

看程序设计,java的流体系就是用装饰者模式设计的,我们自己也来设计一套流。

顶层接口:

/**
 * 输入流顶层接口
 * @author Ade-rui
 *
 */
public interface RInputStream {

	public void read();
	
}

简单的功能类:

/**
 * 文件流
 * @author PC
 *
 */
public class RFileInputStream implements RInputStream{

	public void read() {
		System.out.println("文件读入...");
	}

}

那么这个时候需要接入一个缓存输入流呢? 缓存是一个对真正输入流的功能上的一个扩展,绝不是要重新做一个功能,所以我们需要拿到真正的输入流,再给他加上缓存的功能就可以了。

定义抽象装饰者:

/**
 * 抽象装饰者
 * 重点:
 * 一:与普通的实现类一样需要实现功能接口
 * 二:需要持有一个真正功能类的引用,这里用多态的写法,持有一个接口引用,可以接受任意子类
 * @author PC
 *
 */
public abstract class Decorator implements RInputStream {

	private RInputStream inputStream;
	
	public Decorator(RInputStream inputStream){
		this.inputStream = inputStream;
	}

}

实现缓存流:

/**
 * 缓存流
 * @author PC
 *
 */
public class BufferFileInputStream extends Decorator {

	public BufferFileInputStream(RInputStream inputStream) {
		super(inputStream);
	}

	public void read() {
		System.out.println("拿到流数据,装入到缓存池中..");
		if(isPoolHasData){
			pool.read();
		}else{
			inputStream.read();
		}
	}

}

这就是我们常见的Buffer功能的实现,他内部是持有真正流的引用,然后加上了自身的缓存功能实现的。

所以我们调用的时候也是这样:

public class Client {

	public static void main(String[] args) {
		//我们自己写的
		RInputStream inputStream = new BufferFileInputStream(new RFileInputStream());
		//系统的
		InputStream inputStream2 = new BufferedInputStream(new FileInputStream(new File("")));
	}
	
}


看看有区别吗? 必须没有啊,java的流体系是一个再正规不过的装饰者模式了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值