设计模式之装饰者模式(二)

欢迎大家的不嫌弃,继续和我一起学习设计模式。上一篇已经把装饰者模式的类图有了一个整体的出来,末尾说的去想想实现的代码,你实践了吗?是什么原因让你实践了呢?又是什么原因让你没有动手呢?没动手,可能是思路还不够明确是吗?

接下来,我们继续学习。通过代码实现的方式,来搞定装饰者模式。

写下代码

动手的时候来啦,我们先从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 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());

// 订一杯调料为Soy、Mocha、Whip的HouseBlend咖啡
Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + " $" + beverage3.cost());

}
}

// 输出结果
Espresso $1.99
Dark Roast Coffee , Mocha , Mocha , Whip $1.49
House Blend Coffee , Soy , Mocha , Whip $1.34

目前为止,我们已经把上篇遗留下来的类图转换成了代码实现出来。当我们在后面介绍到工厂和生成器模式的时候,将会有更好的方式建立被装饰者对象。所以,尽管现在的装饰者模式存在部分缺陷,但不妨碍我们对这个模式的学习,后续的增加,只是对模式有更加深刻的认知。

所以,这次的内容就先到这里。下一篇,我们针对性的对现有JDK中的装饰者模式举个例子,并对装饰者模式做出总结。

留个小习题,在这次讲的过程中我们是加了调料, 那咖啡厅里现在都会有杯子的大小,小杯、中杯、大杯,并收取相应的价钱,该如何编写呢?先抛个砖,我们在Beverage类中加上getSize()和setSize()。下次小编会给出答案噢。

PS:代码已经上传,需要查看的朋友点击此处HeadFirstDesign

推荐阅读

设计模式之装饰者模式(一)

爱生活,爱学习,爱感悟,爱挨踢

(0)

相关推荐

  • 如何优雅的用英文在星巴克点单 | 星巴克咖啡种类大普及

    学英语很难,但学习很快乐.     --- 学英语那点事 杯型 Tall 中杯 - 12盎司,含一个浓度的浓缩咖啡 Grande 大杯 - 来源于意大利文,容量16盎司,含两个浓度的浓缩咖啡 Vent ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • [PHP小课堂]PHP设计模式之装饰器模式

    [PHP小课堂]PHP设计模式之装饰器模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式:装饰者模式

    装饰者模式 概述 我们先来看一个快餐店的例子. 快餐店有炒面.炒饭这些快餐,可以额外附加鸡蛋.火腿.培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦. 使 ...

  • java设计模式之装饰器模式

    装饰器模式的定义: 装饰器模式也叫作包装器模式,指在不改变原有对象的基础上,动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构性设计模式. 装饰器模式提供了比 ...

  • 设计模式之装饰器模式

    设计模式之装饰器模式

  • 设计模式-装饰器模式

    装饰器模式 定义 装饰器模式也叫包装模式 在不改变原有对象的基础上,把功能附加到对象上,提供了比继承更有弹性的替代方案 能够扩展原有对象的功能 属于结构型模式 生活中的例子 买煎饼 我们煎饼可以加鸡蛋 ...

  • C#设计模式-装饰器模式(Decorator Pattern)

    引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...

  • PHP设计模式—装饰器模式

    定义: 装饰器模式(Decorator):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器比生成子类更加灵活. 结构: Component:定义一个对象接口,可以给这些对象动态地添加职责. ...

  • 结构型设计模式 - 装饰者模式详解

    基本定义 装饰者模式属于结构型模式,它可以动态的将新功能附加到对象上,同时又不改变其结构.在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(OCP). 模式结构 装饰者和被装饰者有相同 ...