设计模式之装饰者模式(结构型)

定义:

Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比生成子类更为灵活。)

装饰者模式UML类图:

        比如你想喝一杯咖啡,一杯10块钱,我们叫它原味咖啡。原味咖啡有点儿苦,你想让老板加点糖,老板说可以,不过的价钱,加一份儿糖2块钱,我们叫它加糖咖啡,这时你又想到,加点儿奶是不是更好喝一些,同样得加钱,加份儿奶3块钱,这样你就得到了一杯加糖牛奶咖啡。代码如下:

饮料抽象类:

public abstract class Beverage {

    protected String description = "Unknown Beverage";

    public String getDescription() {
        return description;
    }

    public abstract double getPrice();
}

饮料实现类-咖啡:

public class Coffee extends Beverage {
    @Override
    public double getPrice() {
        return 10.00;
    }
}

装饰者类:

public class BeverageDecorator extends Beverage {

    private Beverage beverage;

    public BeverageDecorator(Beverage beverage) {
        this.beverage = beverage;
    }

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

    @Override
    public double getPrice() {
        return beverage.getPrice();
    }
}

 

装饰者实现类,给咖啡加糖:

public class SugarCoffee extends BeverageDecorator {

    public SugarCoffee(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ",加糖";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 2.00;
    }

}

装饰者实现类,给咖啡加牛奶:

public class MilkCoffee extends BeverageDecorator {

    public MilkCoffee(Beverage beverage) {
        super(beverage);
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ",加牛奶";
    }

    @Override
    public double getPrice() {
        return super.getPrice() + 3.00;
    }

}

 

客户端:

public class Client {

    public static void main(String[] args) {
        //创建一种叫咖啡的饮料
        Beverage coffee = new Coffee();
        //给咖啡加糖
        coffee = new SugarCoffee(coffee);
        //给咖啡加牛奶
        coffee = new MilkCoffee(coffee);

        System.out.println("你点的饮料是:"+coffee.getDescription()+"\n"+"价格是:"+coffee.getPrice()+"元");

    }


}
    当我们需要扩展一个类的功能,或者给一个类动态的附加功能,又或者想在一个方法的执行前/后添加自己的行为,都可以选择装饰者模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值