`

java设计模式——装饰者模式

阅读更多

装饰者模式
一 问题的引入
       Starbuzz是一家咖啡连锁店,他们准备更新订单系统,这是他们原先的设计,他们准备更新订单系统,以和服他们饮料的供应需求。


解决方案
 A.使用继承



 每个cost()方法计算出每种搭配的价格。
 评价:很明显这种方法不可取。

B从Beverage基类下手,加上实例变量代表是否加上某种配料(牛奶,豆浆,mocha).
 

 


 评价:如果加双倍mocha怎么办?调料价格的改变会导致改变我的代码?……………..
 C 装饰者模式解决
 如顾客想要一杯mocha和奶泡深焙咖啡那么要做的事情是:
 1.那一个深焙咖啡(DarkRoast)对象。
 2.以Mocha对象装饰它。
 3.以奶泡(Whip)对象装饰它。
 4.调运cost()方法,并依赖委托将各个价格加上去。
 如何“装饰”一个对象又如何“委托”呢?图解



 

 

装饰者模式类图:



 

 

Starbuzz的具体解决方案:


代码:
Beverage基类:

 

public abstract class Beverage {
    /*
     * 
     * Beverage 抽象类。
     */
	String description="Unkonwn Beverage";
	public String getDescription(){
		return description;
	}
	public abstract double cost();
}

 

 

Condiment抽象类:

 

public abstract class CondimentDecorator extends Beverage {
	/*
	 * 
	 * (non-Javadoc)
	 *condiment 调料的抽象类 也就是装饰类的抽象类
	 */
	public abstract String getDescription();
	
}

 

 组件类:

 

public class HouseBlend extends Beverage {
	public HouseBlend(){
		description="HouseBlend";
	}
	@Override
	public double cost() {
		// TODO Auto-generated method stub
		return 0.89;
	}

}

 

装饰者类(配料类):

 

public class Mocha extends CondimentDecorator {

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

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

}

 

 

测试类:

 

public class DecorateTest {
	
		public static void main(String[] args) {
			Beverage beverage=new Espresso();
			System.out.println(beverage.getDescription()+"$"+beverage.cost());
			
			Beverage beverage2=new HouseBlend();
			beverage2=new Mocha(beverage2);
			beverage2=new Mocha(beverage2);
			
			beverage2.getDescription();
			System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
		}
	}

 

 
 总结:

             装饰者模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了更有弹性的替代方案

             缺点:类太多了,不容易一下子搞清楚,Java I/O的设计正是装饰者模式。

 

以上内容全部来源于《head first 设计模式》如果想详细了解请参考原书。


 

 


 

  • 大小: 123.3 KB
  • 大小: 157.8 KB
  • 大小: 97.5 KB
  • 大小: 117.8 KB
  • 大小: 152.7 KB
  • 大小: 149 KB
  • 大小: 114.8 KB
0
0
分享到:
评论

相关推荐

    JAVA设计模式学习12——装饰器模式

    NULL 博文链接:https://alaric.iteye.com/blog/1911949

    Java设计模式-装饰者模式

    本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》

    Java设计模式 版本2

    对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    深入浅出设计模式(中文版电子版)

    4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 ...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

    深入浅出设计模式(中文版)

    4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 ...

    Pattern-Decorator-Java:设计模式工作坊——装饰者模式

    您必须实现装饰器模式,以便可以在运行时添加提到的服务。 作为开发服务如何工作的示例,在运行时创建一个用加密和缓存装饰的 JSON 策略,以及一个带有日志记录的 XML 策略。 请记住,您必须提供源代码和详细说明所...

    design-pattern-java.pdf

    扩展系统功能——装饰模式(三) 扩展系统功能——装饰模式(四) 外观模式-Facade Pattern 深入浅出外观模式(一) 深入浅出外观模式(二) 深入浅出外观模式(三) 享元模式-Flyweight Pattern 实现对象的复用——...

    quanke#design-pattern-java#扩展系统功能——装饰模式(二)1

    装饰模式的核心在于抽象装饰类的设计,其典型代码如下所示://维持一个对抽象构件对象的引用public Decorator(Component component

    设计模式——开发常用的设计模式梳理

    本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现>组合>聚合>关联>依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    管理系统javasal源码-Design-Patterns-Demo:超全的设计模式——理论+实现demo

    设计模式 源码地址: 博客地址: 分类 序号 模式 & 描述 包括 1 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

Global site tag (gtag.js) - Google Analytics