装饰器模式定义
- 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生产的子类更为灵活
- 原有类接口component,及具体实现类concreteComponent,他们需要添加一些职责。
- Decorator装饰类继承component,
- concreteDecorator是为component来增加功能的。
例子1
- 这个例子我们已人为component,想为人添加额外各种衣服的后的包装类
- 穿各种衣服类则是具体的包装类。
- 对于client则使用穿完衣服的人组件。
代码2例子讲解
- 游戏场景中计算装备的攻击值。
- 我们定义装备类为具体的组件
- 各种宝石包装类组件去包装装备。
- client端使用类则使用包装后的装备,输出加强的攻击值。
/**
* 装备接口
*/
public interface IEquip {
/**
* 计算攻击力
*
* @return
*/
public int caculateAttack();
/**
* 装备的描述
*
* @return
*/
public String description();
}
/**
* 武器
* 攻击力20
*
* @author zhy
*/
public class ArmEquip implements IEquip {
@Override
public int caculateAttack() {
return 20;
}
@Override
public String description() {
return "屠龙刀";
}
}
/**
* 抽象的包装类,
*/
public interface IEquipWrap extends IEquip{
}
/**
* 红宝石装饰品 每颗攻击力+15
*
* @author zhy
*/
public class RedGemDecorator implements IEquipWrap {
/**
* 每个装饰品维护一个装备
*/
private IEquip equip;
public RedGemDecorator(IEquip equip) {
this.equip = equip;
}
@Override
public int caculateAttack() {
return 15 + equip.caculateAttack();
}
@Override
public String description() {
return equip.description() + "+ 红宝石";
}
}
/**
* 黄宝石装饰品
* 每颗攻击力+10
*
* @author zhy
*/
public class YellowGemDecorator implements IEquipWrap {
/**
* 每个装饰品维护一个装备
*/
private IEquip equip;
public YellowGemDecorator(IEquip equip) {
this.equip = equip;
}
@Override
public int caculateAttack() {
return 10 + equip.caculateAttack();
}
@Override
public String description() {
return equip.description() + "+ 黄宝石";
}
}
项目中应用