设计模式三之装饰者模式

注:本文主要思想来自《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



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

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

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值