《Head First 设计模式》之装饰者模式
作者:Grey
原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html
模式名称
装饰者模式(Decorator Pattern)
需求
定义咖啡厅中的每一类咖啡,并且计算其价格。每类咖啡都可以增加配料,价钱会根据不同配料而改变。
解决方案
定义一个Beverage
抽象类,用来表示饮料:
public abstract class Beverage {
public String description = "Unknown Description";
public String getDescription() {
return description;
}
public abstract double cost();
}
每类咖啡继承这个抽象类,实现自己的cost()
方法,
Espresso咖啡:
public class Espresso extends Beverage {
Espresso() {
description = "Espresso";
}
@Override
public double cost() {
return 1.99d;
}
}
HouseBlend咖啡:
public class HouseBlend extends Beverage {
HouseBlend() {
description = "HouseBlend";
}
@Override
public double cost() {
return .99d;
}
}
在这里,配料(CondimentDecorator
)作为装饰者,也继承自Beverage
类,是一个抽象类:
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
具体配料继承这个装饰者,并包含一个Beverage
类的引用,这个引用类就是要装饰的对象:
public class Mocha extends CondimentDecorator{
private Beverage beverage;
Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public double cost() {
return .2d+beverage.cost();
}
@Override
public String getDescription() {
return beverage.getDescription()+", Mocha";
}
}
测试代码:
public class CoffeeTest {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println("Espresso cost : "+ beverage.cost() + " description:"+beverage.getDescription());
Beverage beverage1 = new HouseBlend();
beverage1 = new Mocha(beverage1); // HouseBlend 加一份mocha
beverage1 = new Mocha(beverage1); // HouseBlend 再加一份mocha
System.out.println("HouseBlend cost:"+beverage1.cost() + " description:"+beverage1.getDescription());
}
}
输出结果:
Espresso cost : 1.99 description:Espresso
HouseBlend cost:1.39 description:HouseBlend, Mocha, Mocha
完整代码: Decorator Pattern Source
《Head First 设计模式》之装饰者模式的更多相关文章
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- C#设计模式(9)——装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- 设计模式之装饰者模式-java实例
设计模式之装饰者模式 需求场景 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式. 我们已经有了产品,而且这个产品的功能非常 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- PHP设计模式之装饰器模式(Decorator)
PHP设计模式之装饰器模式(Decorator) 装饰器模式 装饰器模式允许我们给一个类添加新的功能,而不改变其原有的结构.这种类型的类属于结构类,它是作为现有的类的一个包装 装饰器模式的应用场景 当 ...
- 实践GoF的23种设计模式:装饰者模式
摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...
- Java 的设计模式之一装饰者模式
刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...
- Head First 设计模式 --3 装饰者模式 开闭原则
装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比集成更有弹性的替代方案.设计原则:1:封装变化2:多用组合,少用继承3:针对接口编程,不针对实现编程4:为对象之间的松耦合设计而努力5 ...
- [设计模式] 9 装饰者模式 Decorator
转:http://www.jellythink.com/archives/171#prettyPhoto 什么是装饰模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对装饰模式 ...
随机推荐
- Node.js 框架
Node.js的是一个JavaScript平台,它允许你建立大型的Web应用程序. Node.js的框架平台使用JavaScript作为它的脚本语言来构建可伸缩的应用. 当涉及到Web应用程序的开发 ...
- ASP.NET Core 数据保护(Data Protection)【中】
前言 上篇主要是对 ASP.NET Core 的 Data Protection 做了一个简单的介绍,本篇主要是介绍一下API及使用方法. API 接口 ASP.NET Core Data Prote ...
- 跨平台网络抓包工具-Microsoft Message Analyzer
Microsoft Message Analyzer (MMA 2013)是微软最受欢迎的Netmon的最新版本. 在Netmon网络跟踪和排除故障功能的基础上提供了更强大的跨平台网络分析追踪能力.园 ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- [ASP.NET MVC 小牛之路]16 - Model 验证
上一篇博文 [ASP.NET MVC 小牛之路]15 - Model Binding 中讲了MVC在Model Binding过程中如何根据用户提交HTTP请求数据创建Model对象.在实际的项目中, ...
- EF:oracle的number类型映射为C#的boolean类型
一开始用下面的方法映射, Property(p => p.IsFixed).HasColumnName("IS_FIXED").HasColumnType("num ...
- 2013 duilib入门简明教程 -- 简单控件介绍 (12)
前面的教程应该让大家对duilib的整体有所映像了,下面就来介绍下duilib具体控件的使用. 由于官方没有提供默认的控件样式,所以我就尽量使用win7或者XP自带的按钮样式了,虽然界 ...
- Redux
redux是Flux的一种实现方式,但还是和Flux有些不同. React控制视图层,要想做一个完整的数据流,必须要用react-redux. 官方demo,自己收集了一下: demo1http:// ...
- ES6学习记录
前言 由于要学习React Native ,所以得用到ES6,故为运用React Native做一个铺垫 学习记录 一.变量 1.let let 与 var 作用相同,用于定义变量,但是作用域不同.不 ...
- 前端MVVM框架avalon揭秘 - 双向绑定原理
avalon大家可能不熟悉,但是Knockout估计或多或少听过用过,那么说说KO的几个概念 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Dec ...