装饰者模式
一 问题的引入
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 设计模式》如果想详细了解请参考原书。
相关推荐
装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...
装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。
《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...
本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...
在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧...——《Head First 设计模式》
装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...
在博客文章“装饰者模式——Decorator”中,作者可能详细讲解了以下几个方面: 1. 装饰者模式的基本概念和原理。 2. 如何通过代码示例展示装饰者模式的实现。 3. 装饰者模式与继承的区别和优势。 4. 装饰者模式在...
### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...
### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在这个压缩包文件“DesignPatterns”中,很可能包含了各种Java设计模式的源代码实现。...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
"大牛解读Java设计模式.pdf"这本书籍,作为这个主题的载体,很可能是由资深专家撰写,用生动的语言和实例帮助读者理解抽象的设计概念,从而提升他们的编程技能。无论你是初学者还是有经验的开发者,都能从中受益匪浅...
本文将深入探讨Java设计模式的基础知识,从UML的基本概念讲起,再到设计模式的分类与应用场景,以及它们在实际编码中的实践意义。 首先,让我们来了解UML——统一建模语言。UML是一种标准化的建模语言,它为软件...
在这个实验报告中,主要讨论了三种设计模式——策略模式、装饰模式和工厂模式的综合运用,以解决一个国际电子商务系统的订单处理问题。 1. **策略模式**: 策略模式的核心在于将算法族封装在独立的可互换的策略类...
"深入浅出设计模式三——Beverage实现(装饰者模式)"这一标题指出,我们将探讨如何使用装饰者模式来实现一个饮品系统。装饰者模式是一种结构型设计模式,它允许我们在运行时向对象添加新的行为或职责,而无需修改对象...
根据提供的标题、描述以及部分内容,本文将深入探讨Java设计模式,并着重分析23种常见的设计模式,以帮助Java程序员更好地理解和应用这些模式。 ### Java设计模式概述 Java设计模式是面向对象软件设计的一种通用可...