Head First Design Patterns 阅读笔记之三: Decorator Pattern
来源:互联网 发布:人工智能理论 编辑:程序博客网 时间:2024/06/05 19:11
欢迎来到 Starbuzz Coffee
星巴克作为一家扩展最快的咖啡店,它们现在需要更新饮料订购系统以便满足现在庞大的需求。这个订购系统的第一版如下:
显然这对于日后的维护来说,完全是个噩梦。这里需要提到一个设计原则(Open-Closed Principles):
类应当对扩展开放,对修改封闭
Classes should be open for extension, but closed for modication.
我们的目标是让类易于扩展以便包含新的行为,同时不去修改现存的源代码。但是并不是在每个部分都要采用这一原则,如果到处滥用,反而会导致代码复杂。一般在代码最重要并且会变化的地方采用这一原则。
使用 Decorator Pattern
如果一个顾客需要 Dark Roast,加 Mocha 和 Whip。我们这么做:
- Take a DarkRoast object
- Decorate it with a Mocha object
- Decorate it with a Whip object
- Call the cost() method and rely on delegation to add on the condiment costs
但是这里的 decorate 怎么做?我们可以把它看做封装器(wrapper)。
下面给一个正式的定义:
The Decorator Pattern attaches additional reponsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
下面给一个图像实例:
而在之前的情境下,可以画出如下框架:
public abstract class Beverage{ String description = "Unknown Beverage"; public String getDescription() { return description; } public abstract double cost();}// 与此类似实现咖啡类 HouseBlend,Espresso,Decaf 类public class DarkRoast extends Beverage{ public DarkRoast() { description = "Dark Roast Coffee"; } public double cost() { return 0.99; }}
public abstract class CondimentDecorator extends Beverage{ public abstract String getDescription();}// 与此类似实现调料类 SteamMilk,Soy,Whip 类public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + ", Mocha"; } public double cost() { return .20 + beverage.cost(); }}
// 测试public class StarbuzzCoffee{ public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription() + " $" + beverage.cost()); Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + " $" + beverage2.cost()); Beverage beverage3 = new HouseBlend(); beverage3 = new Soy(beverage3); beverage3 = new Mocha(beverage3); beverage3 = new Whip(beverage3); System.out.println(beverage3.getDescription() + " $" + beverage3.cost()); }}
现实中的 Decorators:Java I/O,Java I/O 大量使用了 Decorator Pattern。但是 Java I/O 也指出了 Decorator Pattern的一个问题:使用这个模式会有很多小类,这会让使用者感到恐慌。
- Head First Design Patterns 阅读笔记之三: Decorator Pattern
- Head First Design Patterns 阅读笔记之二: Observer Pattern
- Head First Design Patterns 阅读笔记之四: Factory Pattern
- Head First Design Patterns 阅读笔记之五: Singleton Pattern
- Head First Design Patterns 阅读笔记之六: Command Pattern
- 《Head First Design Patterns》笔记三:装饰者模式(Decorator Pattern)
- Head First Design Pattern读书笔记之三 Decorator Pattern
- Head First Design Patterns 阅读笔记之一: Strategy Pattern
- Head First Design Patterns 阅读笔记之七: Adapter and Facade Pattern
- Head First Design Patterns 阅读笔记之八: the Template Method Pattern
- OOP Design (Head First Design Patterns) 学习笔记--04 The decorator pattern
- Head first design patterns c++实现, decorator
- OOP Design (Head First Design Patterns) 学习笔记--03 Observer Pattern
- OOP Design (Head First Design Patterns) 学习笔记--05 The factory Pattern
- 读 head first design patterns笔记(1)
- 《Head First Design Patterns》笔记十五:MVC
- Head First Design Patterns
- Head First Design Patterns
- Add Two Numbers题解
- Partition Magic硬盘分区免费版
- ROS工作空间与程序包的创建
- 教你步步为营掌握自定义 View
- ios开发中最简单的tableview使用一
- Head First Design Patterns 阅读笔记之三: Decorator Pattern
- Java RESTful框架的性能比较
- js动态生成html,获取点击的监控事件写法
- qdu Mathematics and Geometry(思维题)
- VMware 12 安装 Mac OS X 10.10
- 图数据库Titan安装与部署
- [382]Linked List Random Node
- Android闹钟设置的解决方案
- 千里之行,始于足下。从今天开始记录android移动开发的点点滴滴