设计模式之装饰模式(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

 

posted @ 2013-12-30 13:41  Mr轨迹  阅读(238)  评论(0编辑  收藏  举报