装饰者模式定义:动态地将责任附加到对象上。

若要扩展功能。装饰者提供了比继续更有弹性的替代方案。

简单定义:包装一个对象。以提供新的行为。

装饰者模式能够有效应对类爆炸问题。

OO原则:

对扩展开放,对改动关闭。

以书中的StarbuzzCoffee为例:

Beverage.java(饮料抽象类)

package headfirst.decorator.starbuzz;

public abstract class Beverage {
String description = "Unknown Beverage"; public String getDescription() {
return description;
} public abstract double cost();
}

CondimentDecorator.java(调料抽象类)

package headfirst.decorator.starbuzz;

public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}

DarkRoast.java(饮料详细类)

package headfirst.decorator.starbuzz;

public class DarkRoast extends Beverage {
public DarkRoast() {
description = "Dark Roast Coffee";
} public double cost() {
return .99;
}
}

Espresso.java

package headfirst.decorator.starbuzz;

public class Espresso extends Beverage {

	public Espresso() {
description = "Espresso";
} public double cost() {
return 1.99;
}
}

HouseBlend.java

package headfirst.decorator.starbuzz;

public class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
} public double cost() {
return .89;
}
}

Mocha.java(调料详细类)

package headfirst.decorator.starbuzz;

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();
}
}

Soy.java

package headfirst.decorator.starbuzz;

public class Soy extends CondimentDecorator {
Beverage beverage; public Soy(Beverage beverage) {
this.beverage = beverage;
} public String getDescription() {
return beverage.getDescription() + ", Soy";
} public double cost() {
return .15 + beverage.cost();
}
}

Whip.java

package headfirst.decorator.starbuzz;

public class Whip extends CondimentDecorator {
Beverage beverage; public Whip(Beverage beverage) {
this.beverage = beverage;
} public String getDescription() {
return beverage.getDescription() + ", Whip";
} public double cost() {
return .10 + beverage.cost();
}
}

測试类:StarbuzzCoffee.java

package headfirst.decorator.starbuzz;

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());
}
}

输出:

Espresso $1.99
Dark Roast Coffee, Mocha, Mocha, Whip $1.49
House Blend Coffee, Soy, Mocha, Whip $1.34

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Decorator模式设计模式的更多相关文章

  1. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  2. 设计模式之——Decorator模式

    Decorator模式又叫装饰者模式,这种模式是为了满足Java开发的"面向扩展开放,面向修改闭源"的开发原则设计出来的. 在装饰者模式中,不修改源类的代码,却能修改源类中方法的功 ...

  3. 设计模式(十二)Decorator模式

    Decorator模式就是不断地为对象添加装饰的设计模式.以蛋糕为例,程序中的对象就相当于蛋糕,然后像不断地装饰蛋糕一样地不断地对其增加功能,它就变成了使用目的更加明确的对象. 首先看示例程序的类图. ...

  4. 常见设计模式的解析和实现(C++)之九—Decorator模式

    作用:动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. UML结构图: 抽象基类: 1)  Component :定义一个对象接口,可以为这个接口动态地 ...

  5. 《图解设计模式》读书笔记5-2 decorator模式

    目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如he ...

  6. 举例说, Decorator模式(Decorator Pattern)

    前言    在食品工业中的装饰图案具有比较广泛的应用,大多数的两个图案和在网上的例子饮食相关的,一旦被称为电影的手表,点咖啡要加糖要加奶昔要加这加那的时候.感觉好有派~好高大上啊~.为啥我在小卖部都是 ...

  7. 策略模式设计模式(Strategy)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将 ...

  8. 连载:面向对象的葵花宝典:思维、技能与实践(40) - DECORATOR模式

    掌握了道路后,设计模式,我们将以新的方式来理解设计模式,这种方法更简单.更直观.不信?子就知道了 =================================================== ...

  9. Decorator模式(装饰器模式)

    Decorator模式? 假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕.如果加上草莓,就是草莓奶油蛋糕.如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛 ...

随机推荐

  1. Redhat 6.3中syslog信息丢失

    我们採用Linux的syslog来记录产品的debug log. 调用当中的一个可运行文件.运行完命令之后,查看debug log的信息,竟然从某一条log之后的log都丢失了.多次尝试后,发现每次都 ...

  2. cf 323A A. Black-and-White Cube 立体构造

    A. Black-and-White Cube time limit per test 1 second memory limit per test 256 megabytes input stand ...

  3. android中的返回键与Activity

          我在做应用时遇到一个问题.就是在启动主页面时须要预先载入一些数据.我是在一个载入页中处理完这些数据然后再转到主页面.但当我在主页面中按返回键时,系统会返回载入页面.我不希望载入页在使用完之 ...

  4. Android下的单元測试

    android下的单元測试 在AndroidManifest.xml文件里配置下面信息: 在manifest节点下加入: <!-- 指定測试信息和要測试的包 --> <instrum ...

  5. winzip15.0许可证

    username:Juzhaofeng 授权码:MPZRP-Y7LWW-K1DKG-FM92E-2C5F5-ZEKFF

  6. 不合规范的html段落php处理细则

    最近业余时间在维护一个rss聚合应用,就发现很多网站feed的条目摘要存在各种问题,用strip_tags一刀切吧,对摘要的段落和样式扭曲了 例如:有一些网站的摘要是截断输出,例如指定的摘要长度截断, ...

  7. 凝视条件推断浏览器&lt;!--[if !IE]&gt;&lt;!--[if IE]&gt;&lt;!--[if lt IE 6]&gt;&lt;!--[if gte IE 6]&gt;

    <!--[if !IE]><!--> 除IE外可识别 <!--<![endif]--> <!--[if IE]> 所有的IE可识别 <![e ...

  8. LeetCode 53 Spiral Matrix

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  9. iOS Foundation 框架基类

    iOS Foundation 框架基类 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...

  10. kNN(K-Nearest Neighbor)最近的分类规则

    KNN最近的规则,主要的应用领域是未知的鉴定,这一推断未知的哪一类,这样做是为了推断.基于欧几里得定理,已知推断未知什么样的特点和最亲密的事情特性: K最近的邻居(k-Nearest Neighbor ...