设计模式之装饰者模式

这里写目录标题

装饰者模式定义

装饰者模式动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp);

咖啡案例

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:03
 */
public abstract class Drink
{
    public String desc;
    private float price = 0.0f;

    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;
    }

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

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:05
 */
public class Coffee extends Drink
{
    @Override
    public float cost()
    {
        return super.getPrice();
    }
}

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:07
 */
public class YDLCoffee extends Coffee
{
 	//只能在构造方法里面 继承抽象类的属性给抽象类赋值 因为构造方法是初始化当前类的
    public YDLCoffee()
    {
        setDesc("意大利咖啡");
        setPrice(6.0f);
    }
}

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:12
 */
public class USCoffee extends Coffee
{
    public USCoffee()
    {
        setDesc("美式咖啡");
        setPrice(5.0f);
    }
}

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:14
 */
public class CHNCoffee extends Coffee
{
    public CHNCoffee()
    {
        setDesc("中国咖啡!");
        setPrice(7.0f);
    }
}

开始准备装饰者

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:15
 */
public class Decorator extends Drink
{
    private Drink obj;

    public Decorator(Drink obj)
    {
        this.obj = obj;
    }

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

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

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:21
 */
public class Chocolate extends Decorator
{
    public Chocolate(Drink obj)
    {
        super(obj);
        setDesc("巧克力");
        setPrice(2.0f);
    }
}

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:22
 */
public class Milk extends Decorator
{
    public Milk(Drink obj)
    {
        super(obj);
        setDesc("牛奶");
        setPrice(2.0f);
    }
}

package com.lesson9.decorator;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2020/8/31 9:23
 */
public class Soy extends Decorator
{
    public Soy(Drink obj)
    {
        super(obj);
        setDesc("豆浆");
        setPrice(1.5f);
    }
}

形象的来看装饰者模式有点像一层裹着一层,一层又一层的继承,然后装饰者和被装饰者分开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值