“小猪逃命”游戏:一只小猪和一只灰狼,小猪最多5条命,灰狼每咬到小猪一次,小猪就要少一条命,小猪的任务是要逃过灰狼的追咬到猪栏。在逃的过程中小猪可以吃到三种苹果,吃“红苹果”可以给小猪加上保护罩,吃“绿苹果”可以加快小猪奔跑速度,吃“黄苹果”可以使猪趟着水跑。小猪如果吃多种苹果的话,小猪可以拥有多种苹果提供的功能。
这个例子如果用类的继承来实现的话那可就麻烦了,你需要为小猪派生321=6个子类(有保护罩的小猪,奔跑速度加快的小猪,会趟水的小猪,既有保护罩又会趟水的小猪,奔跑速度快且会趟水的小猪,有保护罩且奔跑速度快的小猪,有保护罩、奔跑速度快且会趟水的小猪),当小猪吃到不同的苹果,你就把小猪换成相应的子类实例(好麻烦)。如果有四种苹果的话那你要为小猪派生432*1=24个子类,如果有五种苹果…“子类复子类,子类何其多”。
如果使用装饰模式的那就不用派生诸多子类了,当小猪每吃到一个苹果,我们就用装饰模式给小猪加一个动态增加一个新功能即可。


public class decrator {
	public static void main(String[] args) {
		littlepig p = new littlepig();
		pig p1 = new sheltpig(p);
		p1.run();
		System.out.println("\n*****************************");
		pig p2 = new runfastpig(new sheltpig(p));
		p2.run();
		System.out.println("\n*****************************");
		pig p3 = new runfastpig(new sheltpig(new canwaterpig(p)));
		p3.run();
	}
}

interface pig {
	public void run();

	public void Underattack();
}

class littlepig implements pig { // 具体构件
	@Override
	public void run() {

	}

	@Override
	public void Underattack() {

	}
}

abstract class Decorator implements pig { // 抽象装饰类
	pig p;

// 注入一个抽象构建类型的对象
	public Decorator(pig p) {
		this.p = p;
	}

	@Override
	public void run() {
		p.run();
	}

	@Override
	public void Underattack() {
		System.out.println("\n受伤");
	}
}

class sheltpig extends Decorator {
	public sheltpig(pig p) {
		super(p);
	}

	@Override
	public void run() {
		super.run();
		System.out.print("+保护盾+");
	}

}

class runfastpig extends Decorator {
	public runfastpig(pig p) {
		super(p);
	}

	@Override
	public void run() {
		super.run();
		System.out.print("+快速奔跑+");
	}

}

class canwaterpig extends Decorator {
	public canwaterpig(pig p) {
		super(p);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void run() {
		super.run();
		System.out.print("+能淌水+");
	}

}

 

运行结果: