设计模式-装饰者模式

 

io中的装饰者


1.inputstream是抽象类,是一个基类
2.FileInputStream是inputstream的子类,是具体的被装饰者
3.FilterInputStream是inputstream的子类,是装饰者的基类,类似咖啡样例中的Decorate类
4.DataInputStream是FilterInputStream的子类,是具体的装饰者,类似咖啡样例中的Milk
5.FilterInputStream中有protected volatile InputStream in;即含被装饰者对象

 

装饰者模式点咖啡样例图

public class CoffeeBar {

    //装饰者模式

    public static void main(String[] args) throws Exception {

 

        Drink drink = new LongBlackCoffee();

        System.out.println(drink.cost() + "_ "+ drink.cost());

 

        drink = new MilkDecorate(drink);

        System.out.println(drink.cost() + "_ " + drink.cost());

 

        drink = new MilkDecorate(drink);

        System.out.println(drink.cost());

        System.out.println(drink.getDes());

 

        /**

         * io中的装饰者

         * 1.inputstream是抽象类,是一个基类

         * 2.FileInputStream是inputstream的子类,是具体的被装饰者

         * 3.FilterInputStream是inputstream的子类,是装饰者的基类,类似咖啡样例中的Decorate类

         * 4.DataInputStream是FilterInputStream的子类,是具体的装饰者,类似咖啡样例中的Milk

         * 5.FilterInputStream中有protected volatile InputStream in;即含被装饰者对象

         *

         */

        DataInputStream dis = new DataInputStream(new FileInputStream("/home/d.txt"));

        System.out.println(dis.read());

    }

}

 

 

public abstract class Drink {

 

    //抽象类

    //描述

    public String des;

 

    //金额

    public Double price;

 

    public String getDes() {

        return des;

    }

 

    public void setDes(String des) {

        this.des = des;

    }

 

    public Double getPrice() {

        return price;

    }

 

    public void setPrice(Double price) {

        this.price = price;

    }

 

    /**

     * 计算价格

     * @return

     */

    public abstract Double cost();

 

}

 

 

public class Coffee extends Drink {

    //被装饰者基类 咖啡

    @Override

    public Double cost() {

       return price;

    }

}

 

 

 

public class LongBlackCoffee extends Coffee{

    //具体被装饰的对象 美式咖啡

    public LongBlackCoffee(){

        setDes("单品咖啡");

        setPrice(5.5d);

    }

}

 

 

 

public class Decorate extends Drink {

    private Drink coffee;

    //装饰者 采用组合的方式将被装饰者传入

    public Decorate(Drink coffee){

        this.coffee = coffee;

    }

    @Override

    public Double cost() {

        return getPrice() + coffee.cost();

    }

    public String getDes() {

        return des + " " + getPrice() + "&&" + coffee.getDes();

    }

}

 

 

 

public class MilkDecorate extends Decorate{

    //具体的装饰对象

    public MilkDecorate(Drink coffee) {

        super(coffee);

        setDes( "牛奶调料");

        setPrice(2.2);

    }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值