设计模式三之装饰者模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28666081/article/details/50618168

注:本文主要思想来自《HeadFirst 设计模式》

定义:动态地将责任附加到对象上,若要扩展对象,装饰者模式提供了比继承更弹性的替代方案

->遵循开放-关闭原则(对拓展开放,对修改关闭  即不能修改原先的代码进行拓展)


我这里举咸蛋超人的例子说明:

怪物降临,咸蛋超人从天而降。然而此时的咸蛋超人是刚进新手村的,所以战斗力只有5

public interface Superman {
	String Weapon();     //武器
	int FightCapacity();//战斗力
}
咸蛋超人类,继承了Superman接口
public class Ultraman implements Superman{
	String weapon = "裤衩"; //刚进新手村,身上只有一件绑定衣服(裤衩)
	int fight = 5;   //战斗力只有五的
	
	public String Weapon(){
		return weapon;
	}
	
	public int FightCapacity(){
		return fight;
	}
}
在主类中运行
public class Test {
	public static void main(String[] args) {
		Superman man = new Ultraman();
		man = new Stealth(man);
		man = new LaserGun(man);
		System.out.println("现在装备有:"+man.Weapon());
		System.out.println("现在战斗力有:"+man.FightCapacity());
	}
}

输出为:

现在装备有:裤衩

现在战斗力有:5


于是乎。。。超人刚登场就被怪兽打跑了,但在科学家的思考下决定给超人装备武器,这就是我们的装饰者

科学家在考虑了超人本身是不能拆之后,决定为他添加武器隐形衣镭射枪

他们定制了一个武器入口,专门用于为超人穿戴武器   这就是 抽象装饰者

public abstract class WeaponDecorator implements Superman{ //定义武器类抽象装饰者
	//定义武器装饰方法
	public abstract String Weapon();
	//定义装备了武器后的增加战斗力方法
	public abstract int FightCapacity();
}
有了这个穿戴武器的接口我们就可以穿戴强大的武器(具体装饰者)
具体装饰者 隐形衣类

public class Stealth extends WeaponDecorator{  //武器->隐形衣
	Superman superman;
	String weapon = "隐形衣"; //这是件隐形衣
	int fight = 100;   //隐形+100
	public Stealth(Superman superman){
		this.superman = superman;
	}
	
	public String Weapon(){
		return weapon+","+superman.Weapon();
	}
	
	public int FightCapacity(){
		return fight+superman.FightCapacity();
	}
}
具体装饰者 镭射枪类
public class LaserGun extends WeaponDecorator{  //武器->镭射枪
	Superman superman;
	String weapon = "镭射枪"; //这是把镭射枪
	int fight = 50;   //隐形+100
	
	public LaserGun(Superman superman){
		this.superman = superman;
	}
	
	public String Weapon(){
		return weapon+","+superman.Weapon();
	}
	
	public int FightCapacity(){
		return fight+superman.FightCapacity();
	}
}
科学家总于把全部武器生产好了,我们可以为超人装备武器了,在主类中
public class Test {

	public static void main(String[] args) {
		Superman man = new Ultraman();
		man = new Stealth(man);
		man = new LaserGun(man);
		System.out.println("现在装备有:"+man.Weapon());
		System.out.println("现在战斗力有:"+man.FightCapacity());
	}

}
输出为:

现在装备有:镭射枪,隐形衣,裤衩
现在战斗力有:155



在科学家的帮忙下,咸蛋超人战斗力剧增,很快就帮怪兽消灭了,地球再次得到了和平-------》》》》》》》》》》》》》》》》》》》》

体会:开放-关闭原则 充分体现了组合-委托的优势,摆脱过度依赖继承,增加程序的弹性

展开阅读全文

没有更多推荐了,返回首页