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

/**
*    装饰者模式,动态的将责任附加到对象上,更容易扩展。
*               优点: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本来没有的功能。

你可能感兴趣的:(设计模式)