- 浏览: 1229363 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
上图的实现代码见:
http://quicker.iteye.com/blog/554032
定义:
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供比继承更有弹性的替代方案。
设计原则五:代码应该对扩展开放,对修改关闭。
Beverage系统是一个销售咖啡的订单系统,主要销售咖啡,咖啡有多种,另外有多个种类的调料。
那么如果将Beverage设为超类,其它的咖啡调料等都从这个类继承,并且每个类都有一个cost的计费方法。
类图如下:
上面的类看起来要爆炸了。。。
我们看看使用装饰模式后的类图。
http://quicker.iteye.com/blog/554032
文中讲过一点:
在装饰者类中使用了继承,又把父类的引用作为它的属性。
这是因为继承能使类型保持一致,而我们要灵活的使用类的行为则需要使用组合。
继承:装饰者要与被装饰者保持一样的类型,因为装饰者必须能取代被装饰者。
组合:当我们将装饰者与组件组合时,就是加入新的行为。所得到的新的行为,不是继承自超类,而是由组合对象得来的。
所以在上图中继承Beverage抽象类,是为了有正确的类型,而不是继承它的行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。
在上例中正是因为使用对象组合,我们才可以把所有饮料和调料更有弹性地加以混和与匹配,比如客户同时点了多种咖啡和调料的时候。
代码如下:
package com.lwf.disign.learn.decorator; public abstract class Beverage { String description = "Unknown Beverage"; public String getDescription(){ return description; } public abstract double cost(); }
package com.lwf.disign.learn.decorator; public class Espresso extends Beverage { public Espresso(){ description = "Espresso"; } public double cost() { return 1.99; } }
package com.lwf.disign.learn.decorator; public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }
package com.lwf.disign.learn.decorator; 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 0.200 + beverage.cost(); } }
package com.lwf.disign.learn.decorator; public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + " Mocha"; } public double cost() { return 0.400 + beverage.cost(); } }
测试类:
package com.lwf.disign.learn.decorator; public class BeverageTest { public static void main(String[] args) { Beverage b = new Espresso(); System.out.println(b.getDescription() + " $ " + b.cost()); b = new Mocha(b); System.out.println(b.getDescription() + " $ " + b.cost()); b = new Mocha(b); System.out.println(b.getDescription() + " $ " + b.cost()); b = new Whip(b); System.out.println(b.getDescription() + " $ " + b.cost()); } }
输出结果为:
Espresso $ 1.99 Espresso Mocha $ 2.19 Espresso Mocha Mocha $ 2.39 Espresso Mocha Mocha Mocha $ 2.79
上例最后输出的就是客户点了Espresso咖啡,和两份Mocha调料和一份Whip的总消费额。
- decorator.rar (1.7 KB)
- 下载次数: 3
发表评论
-
深入浅出设计模式十四——复合模式
2016-07-05 09:35 5653 -
深入浅出设计模式十一——组合模式
2016-07-05 09:31 4743 -
深入浅出设计模式十二-状态模式(行为型)
2010-07-20 16:27 1628定义: 状态模式: 允许对象在内部状态改变时改变它的行为 ... -
深入浅出设计模式十——迭代模式
2010-07-19 14:24 933我 -
代理模式\装饰模式\适配器模式区别
2010-07-16 17:16 2416代理模式\装饰模式\适配器模式它们有相似性,那么具体在什么情况 ... -
深入浅出设计模式十三——代理模式(结构型)
2010-07-16 11:29 871以下两篇文章分别讲了静态代理与动态代理 http://qu ... -
深入浅出设计模式九——模板方法模式(行为型)
2010-07-14 16:12 1030模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟 ... -
GRASP原则简介
2010-03-10 17:38 2406GRASP(General Responsibilit ... -
深入浅出设计模式六——封装调用(命令模式)
2010-03-08 15:35 1124命令模式: 将一个请求封装为一个对象,从而使你可用不同的请 ... -
深入浅出设计模式五——独一无二(单例模式)
2010-03-08 15:34 1096先看文章 :http://quicker.iteye.com/ ... -
深入浅出设计模式四——多区域比萨加盟店生产比萨实现(抽象工厂模式)
2010-03-05 16:17 1296有关抽象工厂文章可先看:http://quicker.itey ... -
深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)
2010-03-04 17:11 2400在http://quicker.iteye.com/blog/ ... -
深入浅出设计模式二——WeatherData设计(观察者模式)实现二
2010-03-02 17:24 1217在上文:深入浅出设计模式二——WeatherData设计(观察 ... -
深入浅出设计模式二——WeatherData设计(观察者模式)实现一
2010-03-01 14:31 1621UML详细图 良好的OO ... -
深入浅出设计模式一——Duck设计(策略模式)
2010-02-26 18:04 2151以下为针对上图所列代码: package com. ... -
深入浅出设计模式七——Adapter模式(结构型)
2010-02-22 15:45 1135将两个不兼容的类或者说没有关系的类纠合在一起使用。就要在使用 ... -
深入浅出设计模式八——Facade模式(结构型)
2010-02-22 15:06 1849外观模式定义: 外观模式:提供一个统一的接口,用来访问子系统 ... -
创建型——Builder模式
2010-02-04 16:04 988UML: 如何使用: ... -
创建型(单例模式)
2010-01-26 11:39 1009package com.lwf.create.singleto ... -
创建型——工厂模式(抽象工厂)
2010-01-19 23:56 1064UML图 特例图 以图的实现代码: ...
相关推荐
装饰模式是一种设计模式,它允许在不改变对象自身的基础上,在运行时给对象添加新的行为或属性,从而扩展其功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭。在Java等面向对象语言中,装饰模式通常通过继承和...
下面我们将深入探讨装饰者模式的构成及其实现: 1. **组件接口(Component)**:这是所有装饰者和被装饰对象共同实现的接口,定义了它们共同的行为,比如豆浆类可能有一个`drink()`方法。 ```java public ...
装饰者模式是面向对象设计中的一种经典模式,它在不修改已有对象的源代码或继承体系的情况下,通过组合的方式动态地给对象添加新的行为或职责。这种模式在实际开发中非常常见,尤其在需要灵活扩展功能,而又不想破坏...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
在Head First设计模式的讲解中,装饰者模式通常通过具体的例子来阐述,比如饮料(Beverage)和其装饰(Condiment)的例子。在这个例子中,`beverage.h`文件可能包含了饮料类及其装饰类的定义。 首先,我们有一个...
本文将详细探讨《Head First 设计模式》中介绍的装饰者模式在C++中的具体实现。 #### 装饰者模式的关键概念 装饰者模式主要涉及以下几个关键概念: 1. **组件接口**:定义了被装饰对象的行为。在这个案例中,`...
装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...
### 设计模式——装饰者模式详解 #### 一、引言 在软件开发过程中,我们经常需要对现有的类进行功能的扩展或者增加新的行为。传统上,很多人可能会选择通过继承的方式来实现这一目标,即创建一个新的类来继承原有的...
装饰模式是一种结构型设计模式,它允许在运行时动态地为对象添加新的行为或职责,同时保持对象的接口不变。这种模式在不修改原有代码的基础上,通过组合而非继承来扩展对象的功能,避免了类爆炸的问题。 装饰模式的...
比如,你可能在源码中看到一些装饰者类(如CondimentDecorator)和被装饰的基础类(如Beverage)。 6. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...
在《经典装饰者模式》一书中,作者深入探讨了装饰者模式的核心概念及其应用场景。装饰者模式主要关注的是如何在不影响原有代码的基础上,为现有类的功能添加新的特性。这尤其适用于那些需要在运行时根据具体需求灵活...
装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在不违背开闭原则(对扩展开放,对修改关闭)的前提下,提供了灵活的扩展机制。装饰模式通常用于为已有对象添加...
《Head First Design Patterns》是一本广受欢迎的设计模式书籍,通过其深入浅出的讲解方式帮助读者理解复杂的设计概念。本书的第二版继续沿用了这种教学方法,并引入了一系列新的模式和案例研究。本章节主要探讨的是...
### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...
《Head First设计模式》是一本深受程序员喜爱的设计模式入门书籍,以其独特的视觉风格和易于理解的方式解释了23种经典的设计模式。这本书的核心是通过实际的C++代码示例来帮助读者深入理解这些模式,从而提升软件...
让我们深入探讨一下设计模式的核心概念以及在C#中如何应用它们。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在C#中,可以使用静态成员、双重检查锁定或静态构造函数等方式实现。例如,`...
装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...
装饰者模式的解决方案是创建装饰类,如`CondimentDecorator`,它也是`Beverage`的子类,但其主要职责是装饰其他`Beverage`对象,如`Milk`和`Sugar`。这些装饰类持有`Beverage`对象的引用,并在需要时调用其方法,...
装饰模式是一种常用的设计模式,属于结构型模式之一,它的核心在于动态地给一个对象添加一些额外的职责,而无需通过创建子类的方式来实现。这种方式不仅增强了代码的复用性,而且提高了系统的灵活性和可扩展性。 ##...