设计模式:装饰者模式(decorator)

本文介绍装饰者模式的应用,通过一个饮料价格计算的例子展示了如何动态地为对象添加职责,而不使用继承。装饰者模式使得功能扩展更为灵活,尤其适用于Java I/O等场景。

/**
*    装饰者模式,动态的将责任附加到对象上,更容易扩展。
*               优点:1.装饰者模式比继承提供更多的灵活性
*                  2.可以动态的扩展一个对象的功能
*                  3.不同的装饰者进行自由组合
*            栗子:Java I/O
*/

/**
 * @Author : haojiangt  这是我自己模仿写的一个小栗子
 * @Description : 抽象类 饮料
 *                  有两个方法:一个是对于自己的描述,一个是关于饮料的价钱。
 **/

public abstract class Beverage {
    String description = "Beverage";

    public String getDescription() {
        return description;
    }
    public abstract double cost();


    public static void main(String[] args){
        //实例化一杯可乐
        Beverage cola = new Cola();
        //在可乐里加冰,加牛奶
        cola = new IceDecorator(cola);
        cola = new MilkDecorator(cola);

        System.out.println(cola.getDescription() + " " + cola.cost());
        //实例化一杯咖啡
        Beverage coffee = new Coffee();
        //在咖啡里加冰,加牛奶
        coffee = new IceDecorator(coffee);
        coffee = new MilkDecorator(coffee);

        System.out.println(coffee.getDescription() + " " +coffee.cost());

        /*
        * out:
        * Milk Ice cola 6.0
        * Milk Ice coffee 5.0
        */
    }
}

/**
 * @Author : haojiangt
 * @Description :饮料的实现类可乐
 **/

 

public class Cola extends Beverage{
    public Cola (){
        this.description = "cola";
    }
    //可乐的价格是一杯三块
    @Override
    public double cost() {
        return 3;
    }
}

 

/**
 * @Author : haojiangt
 * @Description :饮料的实现类咖啡
 **/

 

public class Coffee extends Beverage{
    public Coffee(){
        this.description = "coffee";
    }
    //咖啡的价格是一杯两块
    @Override
    public double cost() {
        return 2;
    }
}


/**
 * @Author : haojiangt
 * @Description :    装饰者接口
 **/

 

public abstract class Decorator extends Beverage{
    @Override
    public abstract String getDescription();

}

 


/**
 * @Author : haojiangt
 * @Description :    冰块装饰者
 **/

 

public class IceDecorator extends Decorator {
    Beverage beverage;
    //注入一个饮料接口,
    public IceDecorator(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return "Ice " + beverage.getDescription();
    }

    @Override
    public double cost() {
        return 1 + beverage.cost();
    }
}


/**
 * @Author : haojiangt
 * @Description :    牛奶装饰者
 **/
 

public class MilkDecorator extends Decorator{
    Beverage beverage;
    //注入一个饮料接口,
    public MilkDecorator(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return "Milk " + beverage.getDescription();
    }

    @Override
    public double cost() {
        return 2 + beverage.cost();
    }
}

写在最后:

      为什么装饰者Decorator 继承 Beverage呢?因为继承了这个类以后装饰者Decorator也可以当作Beverage这个类来用,同时呢,又方便扩展Beverage本来没有的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值