`
kangsg219
  • 浏览: 123462 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

学习笔记之装饰者模式

阅读更多
装饰者(Decorator)模式又名包装(Wrapper)模式,它动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
package org.kangsg219.abst;

//星巴兹咖啡抽象类
public abstract class Beverage {
	
	public String description="Unknown Beverage!";
	
	public String getDescription(){
		return description;
	}
	
	public abstract double cost();

}


package org.kangsg219.abst;

//调料(Condiment)抽象类
public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;

//浓缩咖啡(Espresso)具体类
public class Espresso extends Beverage {

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

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;
//HouseBlend咖啡具体类
public class HouseBlend extends Beverage {

	public HouseBlend(){
		description="HouseBlend";
	}
	
	@Override
	public double cost() {
		
		return 0.89;
	}

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;
import org.kangsg219.abst.CondimentDecorator;

public class Mocha extends CondimentDecorator {

	public Beverage beverage;
	
	public Mocha(Beverage beverage){
		this.beverage=beverage;
	}
	
	@Override
	public String getDescription() {
		
		return beverage.getDescription()+",mocha";
	}

	@Override
	public double cost() {
		
		return beverage.cost()+0.20;
	}

}


package org.kangsg219.impl;

import org.kangsg219.abst.Beverage;
import org.kangsg219.abst.CondimentDecorator;

//奶泡具体装饰类
public class Whip extends CondimentDecorator {

	public Beverage beverage;
	
	public Whip(Beverage beverage){
		this.beverage=beverage;
	}
	
	@Override
	public String getDescription() {
		
		return beverage.getDescription()+",Whip";
	}

	@Override
	public double cost() {
		
		return beverage.cost()+ 0.10;
	}

}


package org.kangsg219.test;

import org.kangsg219.abst.Beverage;
import org.kangsg219.impl.Espresso;
import org.kangsg219.impl.HouseBlend;
import org.kangsg219.impl.Mocha;
import org.kangsg219.impl.Whip;

public class StarbuzzCoffee {

	
	public static void main(String[] args) {
		//仅要一杯浓缩咖啡,不要调料。
		Beverage beverage=new Espresso();
		System.out.println(beverage.getDescription()+" $"+beverage.cost());
		
		//双倍摩卡的HouseBlend咖啡
		Beverage beverage2=new HouseBlend();
		beverage2=new Mocha(beverage2);
		beverage2=new Mocha(beverage2);
		beverage2=new Whip(beverage2);
		System.out.println(beverage2.getDescription()+" $"+beverage2.cost());		
	}

}


运行结果:
Espresso $1.99
HouseBlend,mocha,mocha,Whip $1.39
分享到:
评论
2 楼 kangsg219 2007-10-20  
网友happyboy2007对奇怪问题的解答:
因为double是双精度浮点型,它本身是并不精确的。而int等整型才是真正精确的数据类型。比如你给a 赋值为 0.89,其实0.89被a接收到后,真正的值并不是精确的0.89,后面还有若干个零,就比如你所看到的运行结果。
正因为浮点数据类型的不精确性,所以它们不能应用于switch的测试表达式。
1 楼 kangsg219 2007-10-19  
在调这个程序的时候发现了一个奇怪的问题:
package org.kangsg219.test;

public class Test {

	
	public static void main(String[] args) {
		double n1=0.89,n2=0.20,n3=0.10;
		System.out.println(n1+n2+n3);
		System.out.println(n1+n3+n2);
	}

}


运行的结果是:
1.1900000000000002
1.19
为什么不相等呢?仅仅是相加顺序不同而已,怎么会这样?不理解,知道的网友请赐教!

相关推荐

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    在“HeadFirst 设计模式学习笔记3--装饰模式 Demo”中,作者通过实例讲解了装饰模式的基本概念、结构和应用场景。这篇文章可能是从CSDN博客平台上的一个链接访问的,遗憾的是,由于我们当前无法直接访问该链接,所以...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    Head First 设计模式学习笔记

    ### Head First 设计模式学习笔记知识点总结 #### 1. 欢迎来到设计模式世界:设计模式入门 - **业务场景**: - **需求背景**:开发一款模拟鸭子的游戏,游戏内包含多种不同种类的鸭子,每种鸭子具有不同的外观...

    C#设计模式学习笔记

    以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    学习笔记-深入浅出设计模式

    在《深入浅出设计模式》的学习笔记中,我们可以看到几种关键的设计模式及其应用,包括策略模式、观察者模式、装饰者模式、工厂模式和抽象工厂模式。 1. **策略模式**: - 策略模式的核心在于将算法族封装在独立的...

    java学习笔记及设计模式

    总的来说,这份“Java学习笔记及设计模式”资源是Java初学者和进阶者的宝贵财富,它不仅涵盖了语言的核心概念,还提供了实际问题的解决方案,有助于提升开发者的专业素养和解决问题的能力。无论是准备面试,还是提升...

    设计模式学习笔记

    ### 设计模式学习笔记 #### 一、简单工厂模式 (Simple Factory) **类图与描述:** 简单工厂模式的核心在于存在一个工厂类,这个工厂类能够根据不同的输入参数返回不同的对象实例。简单工厂模式并不涉及继承关系,...

    java设计模式学习笔记,以及各种模式的代码实现

    8. **装饰器模式**:动态地给一个对象添加一些额外的职责,既扩展了功能,又不改变其接口。 9. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。它可以用于远程代理、虚拟代理、缓存等。 10. **桥接...

    非常详细javaSE学习笔记.rar

    16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。 17. **JVM内部机制**:虚拟机内存结构,类加载机制,字节码执行,性能优化等方面的知识。 这份...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    PS高手之路学习笔记

    【PS高手之路学习笔记】这篇笔记主要涵盖了Photoshop(简称PS)中的色彩模式和绘画装饰工具的使用。在PS的学习过程中,理解并掌握这些基础知识至关重要。 首先,我们来看色彩模式。色彩模式决定了图像中颜色的表现...

    300Java设计模式部分学习笔记

    在软件工程领域中,设计模式(Design ...以上为尚学堂300Java设计模式部分学习笔记中的重点设计模式知识,每个模式都有其独特应用场景和代码实现,通过学习和实践这些设计模式,可以提高软件设计的质量和开发效率。

    《C++20设计模式》学习笔记-第9章装饰器模式-配套代码

    《C++20设计模式》学习笔记-第9章装饰器模式-配套代码

Global site tag (gtag.js) - Google Analytics