设计模式之装饰模式(Decorator)
对于装饰模式的个人理解:
就是在物体上进行某种状态的增强,直白的说:比如一个火箭,默认只有一个推进器,现在想让火箭飞行的更远一点,我们需要在原来的火箭基础上面再添加一个火箭推进器,这样我们原来的火箭就可以依靠2节推进器,飞行的更远了。假如以后我们需求改变,需要有一种飞行更远更远的火箭,我们不需要修改原来的火箭,只要继续追加推进器的数量就行了。这样的解决方案就是装饰模式的精髓。依照上面的案例解释,想想思路,一个燃料接口(FuelInterface),具体的2种燃料(Gas,Hydrogen),Gas下还包括一种增强型燃料(SuperGas),一个测试火箭(Rocket),开始写代码:
public interface FuelInterface { public int addFlyDistance(); }
public class Hydrogen implements FuelInterface{ public FuelInterface fuel; public Hydrogen() { } public Hydrogen(FuelInterface f) { fuel = f; } @Override public int addFlyDistance() { if (fuel != null) return fuel.addFlyDistance() + 5000; else return 5000; } }
public class Gas implements FuelInterface { public FuelInterface fuel; public Gas() { } public Gas(FuelInterface f) { fuel = f; } @Override public int addFlyDistance() { if (fuel != null) return fuel.addFlyDistance() + 2500; else return 2500; } }
public class SuperGas extends Gas { public FuelInterface fuel; public SuperGas() { } public SuperGas(FuelInterface f) { fuel = f; } @Override public int addFlyDistance() { return fuel.addFlyDistance() + 5000; } }
public class Rocket { private FuelInterface fuel; public Rocket(FuelInterface f) { fuel = f; } public int Launch() { return fuel.addFlyDistance(); } }
测试代码:
public class Main { public static void main(String[] args) { Gas g1 = new Gas(); Gas g2 = new Gas(g1); SuperGas g3 = new SuperGas(g2); Hydrogen h1 = new Hydrogen(g3); Hydrogen h2 = new Hydrogen(h1); Rocket r = new Rocket(h2); System.out.println(r.Launch()+"km"); } }
运行结果:
20000km
燃料总量:g1+g2+g3+h1+h2 = 2500 + 2500 + 5000 + 5000 + 5000。这个好处是显而易见的。
下次我们可能需要增加燃料,或者减少燃料。直接在创建时操作就行了。这种跟Java 的IO管道流的多层包装一样。
代码的实现上,我感觉有点递归的感觉,在addFlyDistance()函数中体现,当然,那不是真正意义上面的递归。这样我们的代码可以动态的增加状态,增加新功能。
我们程序的好处是:动态为对象增加新的职责。也就是给火箭动态的增加它的飞行距离,这就是我们需要的效果。该程序的设计有点像小时候用的一种铅笔,那种一节一节组成的,头尾相连,可以连接的非常长,每一节都有一个铅笔头。
项目源代码位置:http://www.kuaipan.cn/file/id_132802506211221457.htm?source=1