1. 程式人生 > >Java設計模式從精通到入門二 裝飾器模式

Java設計模式從精通到入門二 裝飾器模式

介紹

​ 我儘量用最少的語言解釋總結:

​ Java23種設計模式之一,屬於結構型模式,允許向一個現有的物件新增新的功能,不改變其結構。

應用例項:

​ 給英雄聯盟種的射手,新增不同的裝備。先裝備攻速鞋,在裝備電刀,最後裝備無盡

uml類圖如下

主要程式碼如下

ADC類:


/**
 * @ClassName ADC
 * @Description 英雄聯盟射手
 * @Author ouyangkang
 * @Date 2018-11-13 08:49
 **/
public interface ADC {

    /**
     * @Author ouyangkang
     * @Description ADC 必備好吧 攻擊 和贏得勝利
     * @Date 8:50 2018/11/13
     * @param
     * @return void
    **/
    void attack();

    /**
     * @Author ouyangkang
     * @Description 補刀是一個射手必備的素質
     * @Date 8:51 2018/11/13
     * @param 
     * @return void
    **/
    void repairKnives();
}

VN這個射手類

/**
 * @ClassName VN
 * @Description 薇恩 em... 最喜歡的射手之一
 * @Author ouyangkang
 * @Date 2018-11-13 08:53
 **/
public class VN implements ADC {

    @Override
    public void attack() {
        System.out.println("vn 發起了攻擊。。。");
    }

    @Override
    public void repairKnives() {
        System.out.println("vn 開始補刀。。。");
    }
}

ADC 裝備抽象類


/**
 * @ClassName DecorateEquipment
 * @Description ADC 的裝備 抽象類  也就是抽象裝飾
 *
 * 要實現這個射手的介面,並持有改介面的引用
 * @Author ouyangkang
 * @Date 2018-11-13 08:56
 **/
public abstract class DecorateEquipment implements ADC{

    private ADC adc;

    public DecorateEquipment(ADC adc){
        this.adc = adc;
    }

    @Override
    public void repairKnives(){
        this.adc.repairKnives();
    }

    @Override
    public void attack(){
        this.adc.attack();
    }

}

功速鞋類


/**
 * @ClassName SpeedShoe
 * @Description 攻速鞋 這件裝備
 * @Author ouyangkang
 * @Date 2018-11-13 09:08
 **/
public class SpeedShoe extends DecorateEquipment {
    public SpeedShoe(ADC adc) {
        super(adc);
    }



    @Override
    public void repairKnives() {
        // 裝備著攻速鞋進行補刀
        equipment();
        super.repairKnives();
    }

    @Override
    public void attack() {
        // 裝備著攻速鞋進行團戰 殺人
        equipment();
        super.attack();
    }

    /**
     * @Author ouyangkang
     * @Description 裝備
     * @Date 9:03 2018/11/13
     * @param
     * @return void
     **/
    private void equipment(){
        System.out.println("裝備攻速鞋 提升攻速");
    }
}

電刀類


/**
 * @ClassName ElectricKnife
 * @Description 電刀這件裝備
 * @Author ouyangkang
 * @Date 2018-11-13 09:02
 **/
public class ElectricKnife extends DecorateEquipment {

    public ElectricKnife(ADC adc) {
        super(adc);
    }


    @Override
    public void repairKnives() {
        // 裝備著電刀進行補刀
        equipment();
        super.repairKnives();
    }

    @Override
    public void attack() {
        // 裝備著電刀進行團戰 殺人
        equipment();
        super.attack();
    }

    /**
     * @Author ouyangkang
     * @Description 裝備
     * @Date 9:03 2018/11/13
     * @param 
     * @return void
    **/
    private void equipment(){
        System.out.println("裝備電刀這件武器。。。");
    }

}

無盡類


/**
 * @ClassName EndLess
 * @Description 無盡 這件裝備
 * @Author ouyangkang
 * @Date 2018-11-13 09:22
 **/
public class EndLess extends DecorateEquipment {

    public EndLess(ADC adc) {
        super(adc);
    }

    @Override
    public void repairKnives() {
        equipment();
        super.repairKnives();
    }

    @Override
    public void attack() {
        equipment();
        super.attack();
    }

    private void equipment(){
        System.out.println("裝備著無盡 提高暴擊和攻擊力");
    }
}

測試類


/**
 * @ClassName main
 * @Description 建立一個射手 向下傳遞
 * @Author ouyangkang
 * @Date 2018-11-13 09:10
 **/
public class main {

    public static void main(String[] args) {
        // 建立一個射手
        ADC vn = new VN();

        // 第三 裝無盡
        vn = new EndLess(vn);

        // 第二 裝電刀
        vn = new ElectricKnife(vn);

        // 第一 裝攻速鞋
        vn = new SpeedShoe(vn);
        vn.repairKnives();
        System.out.println("-----------------------------");
        vn.attack();


    }
}

測試結果如下:

裝備攻速鞋 提升攻速
裝備電刀這件武器。。。
裝備著無盡 提高暴擊和攻擊力
vn 開始補刀。。。
-----------------------------
裝備攻速鞋 提升攻速
裝備電刀這件武器。。。
裝備著無盡 提高暴擊和攻擊力
vn 發起了攻擊。。。

總結

​ 注意裝飾抽象類需要實現你需要進行裝備的物件。並持有改物件的引用。然後測試類種的物件都是向上傳遞。