設計模式-裝飾者模式 動態地給一個對象添加一些額外的職責。 組件 -> 具體組件 -> 裝飾者(組件) ->具體裝飾者 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