装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。
先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。
现在的需求:
魔法师:法师帽,法师帽可以镶嵌魔魂晶石和灵魂晶石等。
定义装备的接口:
package Equip;
public interface IEquip {
/**
* 显示战斗力
*/
int fightPower();
/**
* 显示属性介绍
*/
String displayEquip();
}
定义装饰接口
package Equip;
/**
* 装备的装饰
* @author Administrator
*
*/
public interface IEquipDecorator extends IEquip{
}
魔法帽
package Equip;
public class EquipMaoZi implements IEquip{
public int fightPower() {
return 10;
}
public String displayEquip() {
return "魔法帽";
}
}
魔魂晶石
package Equip;
public class MoHunDecorator implements IEquipDecorator{
IEquip equip;
static int num;
static String strDecorator;
public MoHunDecorator(IEquip equip){
this.equip=equip;
num+=1;
strDecorator="魔魂+"+num;
}
public int fightPower() {
return equip.fightPower()+1;
}
public String displayEquip() {
return equip.displayEquip()+" + 魔魂晶石";
}
}
灵魂晶石
package Equip;
public class LingHunDecorator implements IEquipDecorator{
IEquip equip;
static int num;
static String strDecorator;
public LingHunDecorator(IEquip equip){
this.equip=equip;
num+=1;
strDecorator="魔魂+"+num;
}
public int fightPower() {
return equip.fightPower()+2;
}
public String displayEquip() {
return equip.displayEquip()+" + 灵魂晶石";
}
}
测试
package Equip;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//装备:魔法帽 魔魂晶石加2
IEquip equip=new MoHunDecorator(new MoHunDecorator(new EquipMaoZi()));
System.out.println(equip.fightPower());
System.out.println(equip.displayEquip());
//改变装备:魔法帽 魔魂晶石加1 灵魂晶石加2
equip=new MoHunDecorator(new LingHunDecorator(new EquipMaoZi()) );
System.out.println(equip.fightPower());
System.out.println(equip.displayEquip());
System.out.println(equip.getClass().getSimpleName());
}
}
结果:
12
魔法帽 + 魔魂晶石 + 魔魂晶石
13
魔法帽 + 灵魂晶石 + 魔魂晶石
MoHunDecorator
尴尬的问题,怎么去在原来装备的基础上去减少晶石呢。