一、对象增强的手段
- 继承:增强的内容是固定的,不能动,被增强的对象也是固定;
- 装饰者模式:增强的内容是固定,被增强的对象可以切换;
- 动态代理(AOP):被增强的对象可以切换(Service),增强的内容也可以切换(事务处理)
二、装饰者模式
1、装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代理继承关系,更加灵活,同时避免类型体系的快速膨胀。
2、例子:
Java API 中的 IO流
①字节:InputStream、OutputStream
②字符:Reader、Writer
InputStream
FileInputStream:它是节点流,就是和一个自由绑定在一起的,文件
BufferedInputStream:它是装饰流,创建我是一定要给我一个底层对象,然后我不管你给我什么流,我都给它创建缓冲区。
new BufferedInputStream(任意的InputStream)
FileInputStream in = new FileInputStream("url");
BufferedInputStream b = new BufferedInputStream(in);
ObjectInputStream o = new ObjectInputStream(b);
三、实现细节
装饰者和被装饰者实现共同的接口,将被装饰者对象传入装饰者中。
-
Component:抽象构件角色
-
被装饰对象和装饰对象有相同的接口。这样,客户端对象就能够以与被装饰对象相同的方式与装饰对象交互。
-
-
ConcreteComponent:具体构件角色(被装饰对象)
-
Decorator:装饰角色
-
持有一个抽象构件的引用。装饰对象接收所有客户端的请求,并把这些请求转发给真实的对象(被装饰对象)。这样,就能在真实对象(被装饰对象)调用前后增加新的功能。
-
-
ConcreteDecorator:具体装饰角色
-
负责给真实对象(被装饰对象)增加新的功能。
-
四、简单的应用介绍
装饰:不知道被增强对象的具体类型时,可以使用:是你还是你,一切拜托你!
1 //装饰者与被装饰者需实现相同的接口,MyConnection类为装饰者,con为被装饰对象,Connection为两个类的相同接口 2 3 class MyConnection implements Connection { 4 5 //是你 6 //还是你 7 private Connection con;//底层对象,被增强对象 8 9 public MyConnection(Connection con) { //通过构造器传递底层对象 10 this.con = con; 11 } 12 13 //一切拜托你,不需要增强的方法,直接调用底层的对象相应的方法即可 14 public Statement createStatement() { 15 return con.createStatement(); 16 } 17 18 //增强点,增强该底层对象某个特定的方法 19 public void close() { 20 //把当前连接归还给池 21 } 22 23 } 24 25 class Demo{ 26 @Test 27 public void test(){ 28 Connection con = 通过四大参数创建连接对象,是由mysql提供的。 29 //把需要增强的对象传入装饰者类中 30 Connection con1 = new MyConnection(con); 31 //使用装饰后的对象,调用相应的方法 32 con1.close; 33 } 34 }