我对装饰者模式的理解

一.概念

装饰者模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 

二.设计原则

5.类应该对扩展开放,对修改关闭。

三.举例子

定义一个游戏抽象角色,初始化人物具有这些简单属性:姓名、攻击值和生命值,且分别为空,0和100。当该角色装备宝剑的时候,攻击值就加100,装备盔甲时生命值加20。。

那么当玩家创建角色,初始化一下名字,其他属性就会按系统设定的值。

public abstract class Person {//角色统一基类
	public String getName() {
		return "";//默认空名
	}
	public int getAttack() {
		return 0;//默认0攻击,即无攻击能力
	}
	public int getHealth() {
		return 100;//默认100点血值
	}
	public abstract void showAttribute();//显示当前属性
}
现在有一个玩家进入了游戏,并取名为player。那么他的攻击和生命值应该为0和100.此时只是继承Person就行

public class Player extends Person {
<span style="white-space:pre">	</span>//真正运行的对象
	@Override
	public String getName() {
		return "Player";
	}
	public void showAttribute() {
		System.out.println("name:" + getName() +" attack:"+getAttack() +
				" health:" + getHealth());
	}
	public static void main(String[] args) {
		Person player = new Player();
		player.showAttribute();
		player = new AddSword(player);
		player.showAttribute();
	}
}
Player就是一个真正的对象,也就是说我们需要对这个Player对象进行扩展。不能靠静态的对该角色继承宝剑对象来扩展,也不提倡对类修改。这时候我们得用装饰者模式。

我们首先定义一个装饰者基类,为了更好的扩展和动态的对Player对象进行添加和删除某些功能。。

public abstract class PersonDecorator extends Person {
	private Person person;
	public PersonDecorator(Person person) {
		this.person = person;
	}
	@Override
	public String getName() {
		return person.getName();
	}
	@Override
	public int getAttack() {
		return person.getAttack();
	}
	@Override
	public int getHealth() {
		return person.getHealth();
	}
}
当角色装备宝剑时,该角色就会增加攻击力,那么我们只要对getAttack进行扩展。

public class AddSword extends PersonDecorator {
<span style="white-space:pre">	</span>//此构造函数是为了获取当前角色的状态,以便在原来的基础上进行扩展
	public AddSword(Person person) {
		super(person);
	}
	@Override
	public int getAttack() {
		return super.getAttack() + 100;
	}
	@Override
	public void showAttribute() {
		System.out.println("name:" + getName() +" attack:"+getAttack() +
				" health:" + getHealth());
	}
}
同理,当角色装备盔甲增加生命值20.

public class AddArmour extends PersonDecorator {
	public AddArmour(Person person) {
		super(person);
	}
	@Override
	public int getHealth() {
		return super.getHealth() + 20;
	}
	@Override
	public void showAttribute() {
		System.out.println("name:" + getName() +" attack:"+getAttack() +
				" health:" + getHealth());
	}
}
好的,写完了装饰类后,来测试一下。

public class Test {
	public static void main(String[] args) {
		//初始化角色
		Person player = new Player();
		player.showAttribute();
		//给角色装备宝剑
		player = new AddSword(player);
		player.showAttribute();
		//给角色装备盔甲
		player = new AddArmour(player);
		player.showAttribute();
	}
}

运行结果:



四.我的理解

装饰者模式可以动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。表面上都用了继承,实际比继承具有更多的组合,用的是类的组合来实习。同时保证了对一个类的内部是封闭性。


更多参考:

http://blog.csdn.net/hguisu/article/details/7531960

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值