当想要对已有的对象进行功能的增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
对象增强的手段:
1继承
被增强的对象固定的
增强的内容也是固定的
2装饰者模式
被增强的对象是可以切换的
增强的内容是固定的
3动态代理(AOP)
被增强的对象可以切换:Service
增强的内容也可以切换:事务处理
继承:
缺点:1.增强的内容是死的,不能动! (要么加糖 要么加盐即要加的内容是死得)
2. 被增强的对象也是死的! (只能给纯咖啡里面加东西)
使用继承会使类增多!
class 咖啡类 {}
class 有糖咖啡 extends 咖啡类{}
class 加奶咖啡 extends 咖啡类{}
class 加盐咖啡 extends 咖啡类{}
装饰者模式:
1. 增强的内容是不能修改的!(要么加糖 要么加盐即要加的内容是死得)
2. 被增强的对象可以是任意的! (给我什么东西,我就往那里加东西)
class 咖啡类 {}
咖啡 a = new加糖();
咖啡 b = new加盐(a); //对a进行装饰,即将加糖的咖啡再加盐
咖啡 c = new加奶(b); //对b进行装饰,即将加糖加盐的咖啡再加奶
装饰者模式的应用:
Java API 、 IO流!
四大家族:
1. 字节:InputStream、OutputStream
2. 字符:Reader、Writer
InputStream
FileInputSteram:它是节点流!就是和一个资源绑定在一起的!文件!
BufferedInputStream:它是装饰流!创建我是一定要给我一个底层对象,然后我不管你给我的是什么流,我都会给它添加缓冲区!
new BufferedInputStream(任意的InputStream)
FileInputStream in = new FileInputStream("F:/a.jpg");
BufferedInputStream b = new BufferedInputStream(in);
ObjectInputStream o = new ObjectInputStream(b);