9、结构型模式-装饰器设计模式

2021-07-17  本文已影响0人  日落_3d9f

1、如虎添翼的设计模式-装饰器设计模式

简介:讲解-装饰器设计模式介绍和应用场景

装饰器设计模式 装饰器设计模式 装饰器设计模式

装饰器设计模式案例实战

小滴课堂-老王,由于公司发了项目奖金,不够买跑车,就先买自行车,店家里面 有小号、中号、大号等规格的自行车。
然后改造加一个喇叭,后来不够又要加多一个,一个防爆胎不够,又有两个,存在很多个随机组合的改装。
店家就苦恼了,这样的结构难搞,价格也难算,而且需求再变动,就更麻烦了。使用装饰者就可以解决这个问题

装饰器设计模式案例

2、代码:

通用组件:

public interface Bike {
    String getDescription();
    int getPrice();
}

具体的被装饰者,ConcreteComponent

public class BigBike implements Bike{

    private String description = "大号自行车";

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 200元是大号自行车的价格
     * @return
     */
    @Override
    public int getPrice() {
        return 200;
    }
}

具体的被装饰者,ConcreteComponent

public class SmallBike implements Bike{

    private String description = "小号自行车";

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 100元是小号自行车的价格
     * @return
     */
    @Override
    public int getPrice() {
        return 200;
    }
}

装饰者:

public class BikeDecorator implements Bike {
    private String description = "我只是装饰器,啥都不表示,子类帮我传递";
    @Override
    public String getDescription() {
        return description;
    }
    @Override
    public int getPrice() {
        return 0;
    }
}

RSC 是防爆胎的缩写,角色 ConcreteDecorator

public class RSCBikeDecorator extends BikeDecorator {
    private String description = "增加一个防爆胎";
    private Bike bike;
    public RSCBikeDecorator(Bike bike){
        this.bike = bike;
    }
    @Override
    public String getDescription() {
        return bike.getDescription() + ","+ description;
    }

    /**
     * 100 是防爆胎的价格
     * @return
     */
    @Override
    public int getPrice() {
        return bike.getPrice() + 100;
    }
}

喇叭,角色 ConcreteDecorator

public class SuonaBikeDecorator extends BikeDecorator {
    private String description = "增加一个喇叭";
    private Bike bike;
    public SuonaBikeDecorator(Bike bike){
        this.bike = bike;
    }
    @Override
    public String getDescription() {
        return bike.getDescription() + ","+ description;
    }
    /**
     * 50 是唢呐喇叭的价格
     * @return
     */
    @Override
    public int getPrice() {
        return bike.getPrice() + 50;
    }
}

Main函数:

public class Main {
    public static void main(String[] args) {
        /**
         * 大自行车 200
         * 小自行车 100
         * 防爆胎 100
         * 喇叭 50
         */

        //选个自行车
        Bike bike = new BigBike();
        //搭配了个RSC防爆胎
        bike = new RSCBikeDecorator(bike);
        bike = new RSCBikeDecorator(bike);
        //搭配了一个喇叭
        bike = new SuonaBikeDecorator(bike);
        bike = new SuonaBikeDecorator(bike);
        System.out.println(bike.getDescription()+", 价格:"+bike.getPrice());
    }
}

执行结果:

大号自行车,增加一个防爆胎,增加一个防爆胎,增加一个喇叭,增加一个喇叭, 价格:500

装饰器设计模式案例

3、讲解-装饰器设计模式在JDK源码里面应用场景

JDK源码里面的Stream IO流-装饰器设计模式应用

image-20200929172105246
public class FileInputStream extends InputStream
{
    /* File Descriptor - handle to the open file */
    private final FileDescriptor fd;
}

持有引用

//添加了Buffer缓冲功能
InputStream inputStream = new BufferedInputStream(new FileInputStream(""));

上一篇 下一篇

猜你喜欢

热点阅读