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 发起了攻击。。。

总结

​ 注意装饰抽象类需要实现你需要进行装备的对象。并持有改对象的引用。然后测试类种的对象都是向上传递。

posted @ 2018-11-13 09:57  家里那只橘猫  阅读(127)  评论(1编辑  收藏  举报