我对装饰者模式的理解
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
相关文章推荐
- 装饰者模式浅浅的理解
- 深入理解JavaScript系列(29):设计模式之装饰者模式
- java装饰者模式理解
- 设计模式-装饰者模式(Decorator)理解和在Android中的应用
- 自已理解的装饰者模式
- 简单理解设计模式之装饰者模式
- 笔记:装饰者模式的初步理解
- 深入理解JavaScript系列(29):设计模式之装饰者模式详解
- 装饰者模式简单理解
- 深入理解JavaScript系列(29):设计模式之装饰者模式
- 我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
- 我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
- 我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)
- 装饰者模式理解
- 设计模式--装饰者理解
- 深入理解JavaScript系列(29):设计模式之装饰者模式
- 从装饰者模式的理解说JAVA的IO包
- 装饰者模式(不太理解的设计模式)
- 深入理解JavaScript系列(29):设计模式之装饰者模式