设计模式-装饰者模式 动态地给一个对象添加一些额外的职责。 组件 -> 具体组件 -> 装饰者(组件) ->具体装饰者 Component :定义了一个可以被动态添加功能的接口 Decorator :持有一个Component对象的引用,并且定义了一个和Component保持一致的接口。 ConcreteDecorator :为Component添加功能的角色。
装饰者模式关键的设计就是 组件接口,然后装饰者和具体的角色都去实现这个接口。
下面用装饰者模式 实现 战士 装备不同的武器 战斗力变化的情况。
先定义一个component
/**
* 装饰者模式 组件抽象接口
* 战士 组件抽象接口
*/
public interface SoldierComponent {
int getPower();
}
具体的战士类ConcreteDecorator :
public class Soldier implements SoldierComponent {
@Override
public int getPower() {
System.out.println("战士,基础战斗力 50");
return 50;
}
}
装备接口Decorator :
/**
* 武器装备类
* 实现 战士组件接口
* 组合 战士组件
*
*/
public class EquipDecorate implements SoldierComponent {
/**
* 注意 此处作用域需要 protected,让本包内的子类也可以用到
*/
protected SoldierComponent component;
public EquipDecorate(SoldierComponent component){
this.component = component;
}
@Override
public int getPower() {
return component.getPower();
}
}
具体的装备类 铠甲类
/**
* 铠甲 装备装饰器
*/
public class ArmourEquipDecorate extends EquipDecorate{
public ArmourEquipDecorate(SoldierComponent component) {
super(component);
}
@Override
public int getPower() {
int power = super.getPower();
power += 120 ;
System.out.println("使用 武器-铠甲 增加 战斗力:"+120+" 总战斗力:"+power);
return power;
}
}
具体的装备类 剑类
import java.util.Random;
/**
* 武器-剑
*/
public class SwordEquipDecorate extends EquipDecorate{
public SwordEquipDecorate(SoldierComponent component) {
super(component);
}
public int effect(){
int randomPower = new Random().nextInt(100);
System.out.println("使用 武器-剑 随机增加战斗力"+randomPower);
return randomPower;
}
@Override
public int getPower() {
int power = super.getPower();
int addPower = 100 + effect();
power += addPower;
System.out.println("使用 武器-剑 增加 战斗力:"+addPower+" 总战斗力:"+power);
return power;
}
}
测试类:
public class DecorateTest {
public static void main(String[] args) {
System.out.println("---------新建一个战士类--------------");
SoldierComponent soldier = new Soldier();
System.out.println("******战士的战斗力"+soldier.getPower());
System.out.println("---------给战士装备铠甲--------------");
ArmourEquipDecorate armourEquipDecorate = new ArmourEquipDecorate(soldier);
System.out.println("******铠甲战士的战斗力"+armourEquipDecorate.getPower());
System.out.println("---------给铠甲战士装备剑--------------");
SwordEquipDecorate swordEquipDecorate = new SwordEquipDecorate(armourEquipDecorate);
System.out.println("******铠甲剑战士的战斗力1:"+swordEquipDecorate.getPower());
System.out.println("******铠甲剑战士的战斗力2:"+swordEquipDecorate.getPower());
}
}
测试结果:
---------新建一个战士类--------------
战士,基础战斗力 50
******战士的战斗力50
---------给战士装备铠甲--------------
战士,基础战斗力 50
使用 武器-铠甲 增加 战斗力:120 总战斗力:170
******铠甲战士的战斗力170
---------给铠甲战士装备剑--------------
战士,基础战斗力 50
使用 武器-铠甲 增加 战斗力:120 总战斗力:170
使用 武器-剑 随机增加战斗力64
使用 武器-剑 增加 战斗力:164 总战斗力:334
******铠甲剑战士的战斗力1:334
战士,基础战斗力 50
使用 武器-铠甲 增加 战斗力:120 总战斗力:170
使用 武器-剑 随机增加战斗力75
使用 武器-剑 增加 战斗力:175 总战斗力:345
******铠甲剑战士的战斗力2:345