您的位置:首页 > 其它

我对装饰者模式的理解

2014-08-24 22:38 225 查看

一.概念

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

二.设计原则

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();
}
}


运行结果:



四.我的理解

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

更多参考:

/article/7644636.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: