`
kangsg219
  • 浏览: 121692 次
  • 性别: 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
为什么不相等呢?仅仅是相加顺序不同而已,怎么会这样?不理解,知道的网友请赐教!

相关推荐

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

    HeadFirst 设计模式学习笔记3--装饰模式 Demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5582561.aspx

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

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

    设计模式学习笔记

    工厂模式,策略模式,装饰模式,代理模式,工厂方法模式,原型模式等23个设计模式

    Decorator装饰者模式

    Head First学习笔记+Head First之装饰者模式高清PDF

    尚硅谷设计模式源码笔记课件.zip

    结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、...

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    2. 结构型模式:结构型模式关注对象之间的组合关系,包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。这些模式可以帮助我们更好地组织和管理对象之间的关系,提高代码的灵活性和可...

    java-design-patterns:Java 设计模式学习笔记

    将不同的功能代码解耦桥接模式装饰器模式适配器模式外观模式组合模式享元模式行为型模式(更新中...)作用:将不同的行为代码解耦观察者模式模板方法模式策略模式职责链模式状态模式迭代器模式访问者模式备忘录模式...

    关于自己学习设计模式的笔记整理

    该文档是自己在学习设计模式时整理的常用设计模式pdf文档,包括源码,包括装饰模式,代理模式,责任链模式,命令模式,解释器模式,迭代器模式,备忘录模式,观察者模式,工厂模式,建造者模式,适配器模式,桥梁...

    leetcode下载-LearnNote:学习笔记

    装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六部分 有任何问题欢迎联系: 欢迎...

    leetcode下载-AndroidLearningNotes:Android学习笔记

    装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六部分 有任何问题欢迎联系: 欢迎...

    leetcode下载-LearningNotes:学习笔记

    装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五部分 ##第六部分 有任何问题欢迎联系...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    describe:设计模式学习笔记 逻辑结构图 代码结构图 设计模式简述 创建型模式,共五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式,共七种:适配器模式,装饰器模式,代理模式,...

    左程云leetcode-hjLearningNotes:hj学习笔记

    装饰模式 享元模式 桥接模式 Builder模式 状态模式 解释器模式 观察者模式 备忘录模式 迭代器模式 访问者模式 中介者模式 第二部分:JAVA 第三部分:Spring框架 第四部分:中间件 第五部分 链表 字符串 树 图 查找 ...

    java8源码-akangaroo:学习笔记,完善中

    学习笔记较长,如果想查看文章的目录,chrome浏览器可以配合简悦插件使用,或者下载到本地使用Typora打开。 :hot_beverage: Java基础 Java容器 Java并发 数据结构和算法 数据结构 树 图 算法 分治 动态规划 回溯 ...

    软件设计模式经典案例讲解

    针对几种经典软件设计模式:模板方法模式 外观模式 代理模式 装饰器模式 桥模式 工厂方法模式 组合模式等给出了简单易懂的讲解,透彻明了。很好的学习资料哦,是我平时学习时做的笔记外加自己的理解,很不错的……

    java-design-patterns:java 学习模式

    Java Design Patterns 学习笔记 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    leetcode下载-LearningNote:学习笔记

    装饰模式 享元模式 桥接模式 第二部分 第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 第四部分 第五部分 第六部分 有任何问题欢迎联系: 欢迎...

    leetcode下载-LearningnNotes:学习笔记

    装饰模式 享元模式 桥接模式 ##第二部分 ##第三部分 链表 字符串 树 图 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试指南(左程云)》 ##第四部分 ##第五部分 ##第六部分 有任何问题欢迎联系...

Global site tag (gtag.js) - Google Analytics