欢迎大家的不嫌弃,继续和我一起学习设计模式。上一篇已经把装饰者模式的类图有了一个整体的出来,末尾说的去想想实现的代码,你实践了吗?是什么原因让你实践了呢?又是什么原因让你没有动手呢?没动手,可能是思路还不够明确是吗?
接下来,我们继续学习。通过代码实现的方式,来搞定装饰者模式。
写下代码
动手的时候来啦,我们先从Beverage类下手。这不需要修改原有的设计,如下所示:
/** * * @Description: Beverage是一个抽象类,有两个方法:getDescription()以及cost() * @author:XuYue */ public abstract class Beverage { String description = "Unknown Beverage"; // getDescription()已经在此实现了,但是cost()必须在子类中实现 public String getDescription() { return description; } public abstract double cost(); }
然后我们继续实现Condiment(调料)抽象类,也就是装饰者类:
/** * * @Description: 必须让CondimentDecorator能够取代Beverage,所以将CondimentDecorator扩展自Beverage类 */ public abstract class CondimentDecorator extends Beverage { // 所有的调料装饰者都必须重新实现getDescription()方法,稍后说明原因 public abstract String getDescription(); }
写饮料的代码
有了上面的基础,即已经有了基类,那我们就可以愉快的把饮料类实现了。先从浓缩咖啡(Espresso)开始吧。在这,我们需要实现cost()方法以及将描述设置清楚。其他类,在代码里表现,就不在文中体现啦。
/** * * @Description:首先,让Espresso扩展自Beverage类,因为Espresso是一种饮料 * @author:XuYue */ public class Espresso extends Beverage { public Espresso() { // 为了要设置饮料的描述,我们写了一个构造器,description继承自Beverage description = "Espresso"; } // 需要计算Espresso的价钱 @Override public double cost() { return 1.99; } }
写调料代码
还记得上篇中的类图吗,根据类图我们已经完成了抽象组件(Beverage),有了具体组件(HoustBlend),也有了抽象装饰者(CondimentDecorator)。那么,就差实现具体的装饰者了,也就是我们的调料。这里是列举Mocha,其他的自行实现哦。小编提供的代码里已经实现啦, 感兴趣的小伙伴,可以写完和小编的PK下。
/** * * @Description: * 摩卡是一个装饰者,所以让它扩展自CondimentDecorator * CondimentDecorator扩展自Beverage * @author:XuYue */ public class Mocha extends CondimentDecorator { Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + " , Mocha"; } @Override public double cost() { return 0.20 + beverage.cost(); } }
供应咖啡
恭喜你,经历过之前的准备,是时候坐下来休息休息,点一杯咖啡享受下人生啦。来看看你的装饰者模式设计出来的系统吧。
写之前,我们先看看双倍摩卡咖啡的是怎么装饰的吧。其实就是上一篇中的单倍摩卡,再加一层摩卡的装饰类即可,是不是很神奇呢。
public class StarbuzzCoffee { public static void main(String[] args) { // 订一杯Espresso,不需要调料 Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); // 订一杯双倍Mocha加Whip的DarkRoast()咖啡 Beverage beverage2 = new DarkRoast(); // 用Mocha装饰它 beverage2 = new Mocha(beverage2); // 用第二个Mocha装饰它 beverage2 = new Mocha(beverage2); // 用Whip装饰它 beverage2 = ne