首先看定义:
若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。
理解起来,就是添加业务嘛。
此模式,我们已角色扮演游戏为例:
设计游戏的装备系统,基本要求,要可以计算出每种装备在镶嵌了各种宝石后的攻击力和描述:
具体需求:
1、武器(攻击力20) 、戒指(攻击力5)、护腕(攻击力5)、鞋子(攻击力5)
2、蓝宝石(攻击力5/颗)、黄宝石(攻击力10/颗)、红宝石(攻击力15/颗)
3、每个装备可以随意镶嵌3颗
先是准备装备的超类:
package 装饰者模式;
/**
*
* 装备的接口
*
* @author Administrator
*
*/
public interface IEquip {
/**
* 攻击力的计算
* @return
*/
public int caculateAttack();
/**
* 装备的描述
* @return
*/
public String description();
}
然后就是各种装备:
package 装饰者模式;
public class ArmEquip implements IEquip {
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 20;
}
@Override
public String description() {
// TODO Auto-generated method stub
return "屠龙刀";
}
}
package 装饰者模式;
public class RingEquip implements IEquip {
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 5;
}
@Override
public String description() {
// TODO Auto-generated method stub
return "麻痹戒指";
}
}
package 装饰者模式;
public class ShoeEquip implements IEquip {
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 5;
}
@Override
public String description() {
// TODO Auto-generated method stub
return "圣战靴子";
}
}
package 装饰者模式;
public class WristEquip implements IEquip {
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 5;
}
@Override
public String description() {
// TODO Auto-generated method stub
return "圣战护腕";
}
}
然后就进入正轨:添加业务
package 装饰者模式;
public interface IEquipDecorator extends IEquip{
}
package 装饰者模式;
/**
* 蓝宝石,每个宝石加5点攻击力
* @author Administrator
*
*/
public class BlueGemDecorator implements IEquipDecorator {
/**
* 每个宝石只能维护一个装备
*/
private IEquip equip;
public BlueGemDecorator(IEquip equip) {
this.equip=equip;
}
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 5+equip.caculateAttack();
}
@Override
public String description() {
// TODO Auto-generated method stub
return equip.description()+"装备了蓝宝石";
}
}
package 装饰者模式;
/**
* 红宝石,每个宝石加15点攻击力
* @author Administrator
*
*/
public class RedGemDecorator implements IEquipDecorator {
/**
* 每个宝石只能维护一个装备
*/
private IEquip equip;
public RedGemDecorator(IEquip equip) {
this.equip=equip;
}
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 15+equip.caculateAttack();
}
@Override
public String description() {
// TODO Auto-generated method stub
return equip.description()+"装备了红宝石";
}
}
package 装饰者模式;
/**
* 黄宝石,每个宝石加10点攻击力
* @author Administrator
*
*/
public class YellowGemDecorator implements IEquipDecorator {
/**
* 每个宝石只能维护一个装备
*/
private IEquip equip;
public YellowGemDecorator(IEquip equip) {
this.equip=equip;
}
@Override
public int caculateAttack() {
// TODO Auto-generated method stub
return 10+equip.caculateAttack();
}
@Override
public String description() {
// TODO Auto-generated method stub
return equip.description()+"装备了黄宝石";
}
}
最后进行测试:
package 装饰者模式;
public class test {
public static void main(String[] args) {
// 一个镶嵌2颗红宝石,1颗蓝宝石的靴子
System.out.println(" 一个镶嵌2颗红宝石,1颗蓝宝石的靴子");
IEquip equip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip())));
System.out.println("攻击力 : " + equip.caculateAttack());
System.out.println("描述 :" + equip.description());
System.out.println("-------");
// 一个镶嵌1颗红宝石,1颗蓝宝石的武器
System.out.println(" 一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的武器");
equip = new RedGemDecorator(new BlueGemDecorator(new YellowGemDecorator(new ArmEquip())));
System.out.println("攻击力 : " + equip.caculateAttack());
System.out.println("描述 :" + equip.description());
System.out.println("-------");
}
}
装饰者模式代码完毕