Java设计模式——装饰者模式

来源:互联网 发布:尼尔森的奶粉行业数据 编辑:程序博客网 时间:2024/05/10 06:33
 装饰者模式
     装饰者模式的定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰者(Decorator)很好地遵守了Java设计模式当中一个原则:对扩展开放,对修改关闭。装饰装饰,就是给你加个东西,你还是你自己,但是变得比以前更丰富。装饰者模式也强调了组合的概念,防止继承的滥用。光说无用,我们来举个简单的例子。
    假如我们要开发一个角色游戏,我们先简单写一个角色基类。
   public abstract class Character 
{
public int HP;//生命值
public int MP;//魔法值
/*其他属性...*/
public abstract void die();//死亡
public abstract String getName();//获取角色名称
/*其他方法...*/

}
     接下来创建一个怪物角色
public class Monster extends Character
{
  /*获取名称*/
@Override
public String getName()
{
// TODO: Implement this method
return "Monster";
}

/*死亡*/
@Override
public void die()
{
// TODO: Implement this method
System.out.println("Monster has died");
}

}
创建一个勇士角色
public class Warrior extends Character
{
/*死亡*/
@Override
public void die()
{
// TODO: Implement this method
System.out.println("The warrior has died.");
}
/*获取名称*/
@Override
public String getName()
{
// TODO: Implement this method
return "warrior";
}

}
   如果我们要对角色添加新的能力,我们可能会用继承的方式,这个时候如果添加的能力是相同的话(比如说给角色添加复活的能力),我们就要创建新的类继承特定的角色来实现这个能力,但是当角色非常多的时候,就要创建大量的子类来实现这个能力。但是如果用装饰的方法给角色动态添加功能,也就是程序运行时给角色"装饰"一下,就能大大增强代码的复用性和灵活性。
    首先创建一个装饰基类
public class CharacterDecorator extends Character
{
Character character;
public CharacterDecorator(Character character){
this.character=character;
}
@Override
public String getName()
{
// TODO: Implement this method
return character.getName();
}

    
@Override
public void die()
{
// TODO: Implement this method
character.die();
}

}
复活能力
public class RespawnableAbility extends CharacterDecorator
{
    Character character;
public RespawnableAbility(Character character){
super(character);
}
@Override
public void die()
{
// TODO: Implement this method
character.die();
System.out.println("The "+character.getName()+" has respawned.");
}

/*其他方法...*/
}
无敌能力
public class InvincibleAbility extends CharacterDecorator
{
    Character character;
public InvincibleAbility(Character character){
super(character);
this.character=character;
}
@Override
public void die()
{
// TODO: Implement this method
//修改该方法,使角色无敌
System.out.println("The "+character.getName()+" will never die");
}

}

当我们要为角色增加某个能力的时候,就可以用装饰类去完成
//普通的怪物
Character monster=new Monster();
monster.die();
//无敌的怪物
 Character invincibleMonster=new InvincibleAbility(new Monster());
 invincibleMonster.die();
 //可复活的怪物
 Character respawnableMonster=new RespawnableAbility(new Monster());
 respawnableMonster.die();
 //普通的战士
 Character warrior=new Warrior();
 warrior.die();
 //无敌的战士
 Character invincibleWarrior=new InvincibleAbility(new Warrior());
 invincibleWarrior.die();
 //可复活的战士
 Character respawnableWarrior=new RespawnableAbility(new Warrior());
 respawnableWarrior.die();

运行结果
Monster has died
 The Monster will never die
Monster has died
The Monster has respawned.
The warrior has died.
The warrior will never die
 The warrior has died.
 The warrior has respawned.
这样就完成了装饰模式。


   
·
0 0
原创粉丝点击