看了几集毛骗( 不是毛片 是毛骗) 就11点了..
给爱用继承的人一个全新的设计眼界. 在不修改现有代码的情况下.扩展行为.
>. 装饰者和被装饰者对象有相同的超类型.
>. 你可以用一个或多个装饰者包装一个对象.
>. 既然装饰者和被装饰者对象有着相同的超类型,所以在任何需要原始对象(被包装)的场合,可以用装饰过的对象代替它.
>.(关键点)装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的.
>. 对象可以在任何时候被装饰,所以可以在运行时动态地,,不限量地用你喜欢的装饰者来装饰对象.
装饰者模式要点: 装饰者和被装饰者(组件) 需有相同的超类. 主要用于扩展功能.
优点: 为设计注入弹性, 动态的扩展行为. (组合行为)
区别于继承 ? :
(1).当我们将装饰者与组件组合时,就是在加入新的行为. 所得到的新行为,并不是继承自超类,而是由对象组合得来的.
(2). 如果依赖继承,那么类的行为只能在编译时静态决定. 反之,利用组合,可以把装饰者混合者用....而是在"运行时".
缺点:设计中有大量的小类.导致API复杂 如: IO流(一群装饰者类,这些类用来包装具体组件)
1. OO原则: (1) 封装变化 (2) 多用组合,少用继承 (3) 针对接口编程,不针对实现编程
(4) 为交互对象之间的松耦合设计而努力 (5) 对扩展开放,对修改关闭.
2. OO模式: 装饰者模式---动态地将责任附加到对象上.想要扩展功能, 装饰者提供有别于继承的另一种选择.
模式说明:
装饰者模式动态地将责任附加到对象上.若要扩展功能.装饰者提供了比继承更有弹性的替代方案.
3. 要点:
(1). 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式.
(2). 在我们的设计中,应该允许行为可以扩展,而无须修改现有的代码.
(3). 组合和委托可用于在运行时动态地加上新的行为.
(4). 除了继承,装饰者模式也可以让我们扩展行为.
(5). 装饰者模式意味着一群装饰者类,这些类用来包装具体组件.
(6). 装饰者类反映出被装饰者的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现).
(7). 装饰者可以在被装饰者的行为前面与/或后面加上自已的行为,甚至被装饰者的行为整个取代掉,而达到特定的目的.
(8). 你可以用无数个装饰者包装一个组件.
(9). 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的类型.
(10). 装饰者会导致设计中出现许多小对象. 如果过度使用,会让程序变得很复杂 .
例1: 编写自己的Java I/O装饰者 大写转换为小写
public class LowerCaseInputStream extends FilterInputStream {//扩展FilterInputStream,这是所有InputStream的抽
//象装饰者
public LowerCaseInputStream(InputStream in){
super(in);
}
public int read() throws IOException { //针对字节
int c = super.read(); //如果读到 A 将返回 97 (char)97 后 是 A
return (c==-1?c:Character.toLowerCase((char)c));
}
public int read(byte[] b,int offset,int len) throws IOException{ //针对字节数组 offset 偏移量, 指 从哪个位置开始
int result = super.read(b,offset,len);
for(int i = offset; i<offset+result; i++){
b[i] =(byte)Character.toLowerCase((char)b[i]);
}
return result ;
}
}
测试:
public class InputTest{
public static void main(String[] args) throws IOException{
int c;
try{
InputStream in = new LowerCaseInputStream( new BufferedInputSteram( new FileInputStream("test.txt")));
while((c=in.read())>=0){ //设置FileInputStream ,先用BufferedI 装饰, 再用 LowerCaseInputStream装饰.
System.out.print((char)c);
}
in.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
装饰类 java.io 类
例2 : JDBC连接池.
public class MyConnection implements Connection {
private MyDataSource dataSource;
private Connection connection;
public MyConnection(MyDataSource dataSource, Connection connection) {
this.dataSource = dataSource;
this.connection = connection;
}
@Override
public void close() throws SQLException {
//将当前对象放入连接池
dataSource.freeConnection(this);
}
.....
此外全是重写connection中的方法
}
原文:http://blog.csdn.net/qq717559128/article/details/25747165