`
yan465942872
  • 浏览: 14591 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

设计模式学习之三装饰者模式(Decorator)——解决星巴兹扩张快的问题

 
阅读更多

星巴兹是以扩张速度最快而闻名的咖啡连锁店。如果你在街角看到它的店,在对面街上肯定还会看到另一家。因为扩张速度实在太快了,他们准备更新订单系统,以合乎他们的饮料供应要求。他们原先的类设计是这样的:

购买咖啡时,也可以要求在其中加入各种调料,例如:蒸奶(SteamedMilk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力风味)或覆盖奶泡。星巴兹会根据所加入的调料收取不同的费用。所以订单系统必须考虑到这些调料部分。这是他们的第一个尝试……

好吧,这简直是“类爆炸”。星巴兹为自己制造了一个维护噩梦,如果牛奶的价钱上扬怎么办?新增一种调料风味时,怎么办?

好吧,有人认为上面的设计“笨透了”(这是事实),利用实例变量和继承,就可以追踪这些调料。那我们试试吧,设计类图如下:

但是如果用上面的设计,如果调料价钱改变会使我们更改现有的代码,一旦出现新的调料,我们需要加上新的方法,并且改变超类中的cost()方法。。。。。。上面违背了一个非常重要的原则之一:类应该对扩展开放,对修改关闭。

到了解决真正问题的时候了,在解决问题之前先让我们去认识一下装饰者模式,也就是解决这个问题需要用到的模式。解决问题的办法就是以饮料为主题,然后在运行时以调料来“装饰”饮料。装饰者模式动态地将责任附加到对象上。想要扩展功能,装饰者提供了有别于继承的另一种选择。类图如下:

好吧,现在要开始装饰我们的饮料了,让星巴兹饮料也能符合此框架:

从上面我们能看出:

1. 装饰者和被装饰对象有相同的超类型。

2. 可以用一个或多个装饰者包装一个对象。

3. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到特定的目的。

4. 对象可以在任何时候被装饰,所以可以在运行时动态的,不限量的用你喜欢的装饰者来装饰对象。

5. 装饰模式中使用继承的关键是想达到装饰者和被装饰对象的类型匹配,而不是获得其行为。

现在该是把设计变成真正代码的时候了!先从Beverage类下手,这不需要改变星巴兹原始的设计:

Beverage类很简单,让我们也来实现Condiment(调料)抽象类,也就是装饰者类:

现在已经有了基类,让我们开始实现一些饮料吧。别忘了我们需要为具体的饮料设置描述,而且还必须实现cost()方法:

如果你回头看类图,现在我们已经实现了抽象组件(Beverage),有了具体组件(HouseBlend。。。),也有了抽象装饰者(CondimentDecorator),现在让我们来实现具体装饰者:

OK,现在我们可以坐下来来享受劳动成果了,点几种咖啡尝尝,下订单吧:

真实世界也存在诸多的装饰者,学过Java IO的就知道IO就采用了装饰者模式。下面是装饰的IO类图:

既然你已经知道装饰者模式,也看了Java IO的类图了,那么我们是否可以试着编写自己的输入装饰者了,那么试着编写一个装饰者吧,把输入流的所有大写字符转换成小写:

测试代码:

OK,装饰者模式到此算告一段落了。。。。

分享到:
评论

相关推荐

    装饰者模式——Decorator

    在阅读这篇博客和解压后的“decorator”文件后,你可以深入理解装饰者模式的实现细节,学习如何在自己的项目中运用这一模式,以更优雅的方式扩展功能,同时避免过度使用继承导致的类爆炸问题。通过实践和理解装饰者...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

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

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许动态地给一个对象添加新的功能,而无需修改其原有代码。这个模式的核心思想是通过将对象封装在一个包装器(Decorator)中来扩展其行为,而包装器和原始...

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

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

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

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

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    设计模式——装饰模式

    装饰模式是一种设计模式...通过阅读和理解《设计模式:可复用面向对象软件的基础》等经典书籍,以及像博客“设计模式——装饰模式”这样的在线资源,我们可以深入掌握并灵活运用装饰模式,提高代码的可维护性和扩展性。

    设计模式之装饰者(Decorator)

    装饰者模式是软件设计中的一种行为模式,它允许在运行时动态地给对象添加新的行为或职责,而无需改变对象的原始类。这种模式在不违反开闭原则的前提下,提供了扩展对象功能的能力,使得系统更加灵活,易于维护。 在...

    设计模式之 Decorator模式和代码实现

    【Decorator模式】是一种设计模式,它允许在运行时动态地给对象...在实际的软件开发中,Decorator模式同样适用于那些需要动态增减功能的对象,例如在UI设计中添加装饰元素,或者在数据库连接池中添加不同的连接策略等。

    大话西游之设计模式_从猴王学艺看Decorator 配套代码

    "Decorator"设计模式,又称装饰者模式,是面向对象设计中的一种重要模式。它允许我们动态地给一个对象添加新的行为或职责,而无需修改该对象的类。这个模式的核心思想是封装额外的功能,使得原有对象的功能得到扩展...

    Java设计模式之-Decorator装饰模式

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结。Decorator模式,也称为装饰模式,是设计模式中的一个重要组成部分,它在不改变原有对象接口的前提下,动态地给对象添加新的功能,从而...

    装饰模式——装饰模式.doc

    装饰模式是一种设计模式,属于结构型模式,其主要目的是在不改变对象本身的基础上,通过向对象添加新的行为或属性来扩展其功能。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭。 在装饰模式中,有四个关键...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

Global site tag (gtag.js) - Google Analytics