java-設計模式-裝飾者模式

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

    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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章