GOF结构型模式:装饰模式

“小猪逃命”游戏:一只小猪和一只灰狼,小猪最多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("+能淌水+");
	}

}

 

运行结果:

全部评论

相关推荐

05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 18:05
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务