装饰者模式定义:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。
现实中,装饰者模式就像一个快递。我们购买的东西,需要经过一层一层的包裹,确保稳妥之后才被寄出。如果按照传统的面向对象,每包裹一层就需要设计一个新类,这将会导致类爆炸。还有一个例子就是,我们所喝的咖啡,假设有N种调料,M中原始咖啡豆,它们组合成的咖啡无数种,很明显,我们不可能为每种可能都建立一个类。
这时候就会使用到装饰者模式。
就如同JAVA里面输入输出流。可以去参考api
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
所谓装饰者模式就是,所有子类实现同一接口,且子类都拥有一个接口对象的字段。当一层层装饰之后,调用最终的对象时,则会一层层递归执行相应的方法。(注意递归一词)
代码示例如下:
1
2
3
4
5
6
7
8
|
//剑接口
public
abstract
class
SwordDecored {
protected
SwordDecored swordDecored;
public
abstract
String hurt();
}
|
1
2
3
4
5
6
7
|
public
class
DrinkBloodSword
extends
SwordDecored {
@Override
public
String hurt() {
return
"---饮血剑造成100点伤害"
;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
|
public
class
BlackFlameSword
extends
SwordDecored {
public
BlackFlameSword(SwordDecored swordDecored) {
super
.swordDecored = swordDecored;
}
@Override
public
String hurt() {
return
"----黑火造成200点伤害"
+swordDecored.hurt();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
|
public
class
Main {
public
static
void
main(String[] args) {
DrinkBloodSword drinkBloodSword =
new
DrinkBloodSword();
System.out.println(
"获得饮血剑,并攻击"
);
System.out.println(drinkBloodSword.hurt());
BlackFlameSword blackFlameSword =
new
BlackFlameSword(drinkBloodSword);
System.out.println(
"给饮血剑镶嵌黑炎剑气石,并攻击"
);
System.out.println(blackFlameSword.hurt());
}
}
|