装饰者模式

动态地给一个对象添加一些额外的职责,即增加其额外的功能。

package com.strife.pattern.decorator;

/**
 * 装饰器模式
 *
 * @author mengzhenghao
 * @date 2022/5/29
 */
public class Decorator {

    public static void main(String[] args) {
        AbstractDrink drink = new LongBlackCoffee();
        System.out.println(drink.getDesc() + " 价格:" + drink.cost());

        //加牛奶
        drink = new Milk(drink);
        System.out.println(drink.getDesc() + " 价格:" + drink.cost());

        //加糖
        drink = new Sugar(drink);
        System.out.println(drink.getDesc() + " 价格:" + drink.cost());

    }

}

/** 抽象主体 */
abstract class AbstractDrink {
    protected String desc;
    private float price = 0.0f;

    /** 计算费用的抽象方法 */
    abstract float cost();

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }
}

/** 主体 */
class Coffee extends AbstractDrink {

    @Override
    float cost() {
        return super.getPrice();
    }
}

/** 意大利咖啡 */
class EspressoCoffee extends Coffee {

    public EspressoCoffee() {
        setDesc("意大利咖啡");
        setPrice(6.0f);
    }
}

/** 美式咖啡 */
class LongBlackCoffee extends Coffee {

    public LongBlackCoffee() {
        setDesc("美式咖啡 && 5.0");
        setPrice(5.0f);
    }
}

class ShortBlackCoffee extends Coffee {

    public ShortBlackCoffee() {
        setDesc("short black");
        setPrice(5.0f);
    }
}

/** 装饰者 */
class CoffeeDecorator extends AbstractDrink {

    private AbstractDrink drink;

    public CoffeeDecorator(AbstractDrink drink) {
        this.drink = drink;
    }

    @Override
    float cost() {
        return super.getPrice() + drink.cost();
    }

    @Override
    public String getDesc() {
        return drink.getDesc() + desc + " && " + super.getPrice();
    }
}

/** 具体的装饰者 */
class Milk extends CoffeeDecorator {

    public Milk(AbstractDrink drink) {
        super(drink);
        setDesc(" 加牛奶");
        setPrice(2.0f);
    }
}

/** 具体的装饰者 */
class Sugar extends CoffeeDecorator {

    public Sugar(AbstractDrink drink) {
        super(drink);
        setDesc(" 加糖");
        setPrice(1.0f);
    }
}


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计原则: 少用继承,多用组合 类应该对扩展开放,对修改关闭 目录 本文的结构如下: 什么是装饰者模式 为什么要用...
    w1992wishes阅读 1,284评论 0 7
  • 在程序开发中,许多时候都并不希望某个类天生就非常庞大,一次性包含许多职责。那么我们就可以使用装饰者模式。装饰者模式...
    yufawu阅读 420评论 0 7
  • 设计模式 一、什么是装饰模式 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方...
    凯玲之恋阅读 1,129评论 0 2
  • 引:什么是装饰者模式 在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活,还会带来许...
    27亿光年中的小小尘埃阅读 199评论 0 0
  • 在《JAVA与模式》一书开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装模式。装饰模式以对客户端...
    笨笨翔阅读 413评论 0 2

友情链接更多精彩内容