装饰者模式定义:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。
现实中,装饰者模式就像一个快递。我们购买的东西,需要经过一层一层的包裹,确保稳妥之后才被寄出。如果按照传统的面向对象,每包裹一层就需要设计一个新类,这将会导致类爆炸。还有一个例子就是,我们所喝的咖啡,假设有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()); } } |