`

深入浅出设计模式三——Beverage实现(装饰者模式)

阅读更多

 

上图的实现代码见:

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的总消费额。

 

分享到:
评论

相关推荐

    设计模式——装饰模式

    装饰模式是一种设计模式,它允许在不改变对象自身的基础上,在运行时给对象添加新的行为或属性,从而扩展其功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭。在Java等面向对象语言中,装饰模式通常通过继承和...

    java装饰者模式实现

    下面我们将深入探讨装饰者模式的构成及其实现: 1. **组件接口(Component)**:这是所有装饰者和被装饰对象共同实现的接口,定义了它们共同的行为,比如豆浆类可能有一个`drink()`方法。 ```java public ...

    设计模式之装饰者模式,内含可运行代码

    装饰者模式是面向对象设计中的一种经典模式,它在不修改已有对象的源代码或继承体系的情况下,通过组合的方式动态地给对象添加新的行为或职责。这种模式在实际开发中非常常见,尤其在需要灵活扩展功能,而又不想破坏...

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    在Head First设计模式的讲解中,装饰者模式通常通过具体的例子来阐述,比如饮料(Beverage)和其装饰(Condiment)的例子。在这个例子中,`beverage.h`文件可能包含了饮料类及其装饰类的定义。 首先,我们有一个...

    head first 设计模式装饰着模式C++实现

    本文将详细探讨《Head First 设计模式》中介绍的装饰者模式在C++中的具体实现。 #### 装饰者模式的关键概念 装饰者模式主要涉及以下几个关键概念: 1. **组件接口**:定义了被装饰对象的行为。在这个案例中,`...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    设计模式(极力推荐)第三部分

    ### 设计模式——装饰者模式详解 #### 一、引言 在软件开发过程中,我们经常需要对现有的类进行功能的扩展或者增加新的行为。传统上,很多人可能会选择通过继承的方式来实现这一目标,即创建一个新的类来继承原有的...

    设计模式系列之装饰模式

    装饰模式是一种结构型设计模式,它允许在运行时动态地为对象添加新的行为或职责,同时保持对象的接口不变。这种模式在不修改原有代码的基础上,通过组合而非继承来扩展对象的功能,避免了类爆炸的问题。 装饰模式的...

    Head First 设计模式 源代码

    比如,你可能在源码中看到一些装饰者类(如CondimentDecorator)和被装饰的基础类(如Beverage)。 6. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    经典装饰者模式.pdf

    在《经典装饰者模式》一书中,作者深入探讨了装饰者模式的核心概念及其应用场景。装饰者模式主要关注的是如何在不影响原有代码的基础上,为现有类的功能添加新的特性。这尤其适用于那些需要在运行时根据具体需求灵活...

    装饰模式代码示例

    装饰模式是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式在不违背开闭原则(对扩展开放,对修改关闭)的前提下,提供了灵活的扩展机制。装饰模式通常用于为已有对象添加...

    Head First Design Patterns 2

    《Head First Design Patterns》是一本广受欢迎的设计模式书籍,通过其深入浅出的讲解方式帮助读者理解复杂的设计概念。本书的第二版继续沿用了这种教学方法,并引入了一系列新的模式和案例研究。本章节主要探讨的是...

    设计模式-模板方法模式ppt

    ### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...

    Head First设计模式C++代码

    《Head First设计模式》是一本深受程序员喜爱的设计模式入门书籍,以其独特的视觉风格和易于理解的方式解释了23种经典的设计模式。这本书的核心是通过实际的C++代码示例来帮助读者深入理解这些模式,从而提升软件...

    c#设计模式案例源码.zip

    让我们深入探讨一下设计模式的核心概念以及在C#中如何应用它们。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在C#中,可以使用静态成员、双重检查锁定或静态构造函数等方式实现。例如,`...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    PHP设计模式之装饰者模式

    装饰者模式的解决方案是创建装饰类,如`CondimentDecorator`,它也是`Beverage`的子类,但其主要职责是装饰其他`Beverage`对象,如`Milk`和`Sugar`。这些装饰类持有`Beverage`对象的引用,并在需要时调用其方法,...

    装饰模式应用研究.pdf

    装饰模式是一种常用的设计模式,属于结构型模式之一,它的核心在于动态地给一个对象添加一些额外的职责,而无需通过创建子类的方式来实现。这种方式不仅增强了代码的复用性,而且提高了系统的灵活性和可扩展性。 ##...

Global site tag (gtag.js) - Google Analytics