设计模式学习(2)

原创 2016年06月01日 18:09:21

3.装饰者模式

装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
设计原则:类应该对外扩展开放,对修改关闭。
现在以一个咖啡店为例介绍装饰者模式。这家咖啡店提供不同种类的咖啡,并且这些咖啡都可以加上不同种类的调料,不同的咖啡(或者调料)会有不同的价格,设计一个方案,可以简单完整的表示咖啡店的所有咖啡。
方案一:(思路最简单但维护最麻烦)
把不同的的调料和咖啡一 一 搭配,得到所有的类这里写图片描述
beverage是饮料的超类,每种咖啡都必须继承beverage,其中cost()方法需要具体类来实现。这种方案下,如果调料价格修改,需要对多个类进行修改,维护工作量太大。
方案二:(装饰者模式)
这里写图片描述
从类图中,我们可以看到整个系统结构清晰了很多。下面简要说明一下类图,Beverage是抽象的组件类,具体的组件都要继承这个类,并具体实现这个类下的cost()方法,condimentDecorator类继承Beverage不是为了获得它的方法,只是为了拥有Beverage的类型。Milk,Mocha…是具体的装饰者,每个装饰者在初始化时必须传入Beverage类型的被装饰者,所以可以传入组件,也可以传入装饰者,也就是说装饰者在装饰完一个对象后,还可以被下一个装饰者继续装饰,如此以来,程序就具有灵活性了。下面看一个具体装饰者的实现:
这里写图片描述
这样以来,如果想要制作一杯咖啡,可以选择具体咖啡的类型组件,然后需要什么调料就用这种调料装饰就可以了。

4.工厂模式

工厂模式还可以细分为3个不同的模式,简单工厂模式,工厂方法模式和抽象工厂模式。
下面还是以具体事例讲(这些事例都是Head first中的,直接拿来用了)
假设有一家pizza店,想要设计一个点餐系统。这家pizza店有不同种类的pizza可供选择,顾客可以在点餐时选择不同口味的pizza。
首先,你可能会想这么设计:

这里写图片描述
这样设计有什么问题呢?如果这么写程序的话,其实是在针对实现编程,把程序写死了。如果pizza店有新的口味的pizza,你需要重新修改if-else这段代码,如果某种pizza下架了,你也需要if-else这段代码。下面看看简单工厂模式怎么设计的吧。

简单工厂模式
这里写图片描述
这下我们有了制作pizza的工厂,所有pizza店就不用担心制作哪种口味的pizza了。
这里写图片描述
现在pizza店的类图是这样的。
这里写图片描述

工厂方法模式
由于这家pizza店的pizza销量特别好,现在有许多店想加盟。因为加盟店所处的地理位置不同,他们制作pizza的口味也会有所不同。但是最初的pizza店还想对加盟商制作pizza的过程加以控制。下面是设计思路:
先有一个pizzaStore抽象类,
这里写图片描述
这个类中已经规定了pizza的prepare,bake…等流程,但是pizza的口味,需要子类具体实现(也就是加盟商自己来处理)。下面看一下纽约口味的:
这里写图片描述
工厂方法模式
它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类的实例化推迟到子类。

抽象工厂模式
现在pizza店想要控制加盟店的原料选择,以免偷工减料。
首先有一个抽象原料接口,
这里写图片描述
然后不同加盟店有自己的具体原料工厂,制作不同口味的调料。
以纽约为例:
这里写图片描述
重新制作pizza:
这里写图片描述
具体的pizza类:
这里写图片描述
最后是具体pizzaStore
这里写图片描述
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。

如何正确学习和使用设计模式

学习设计模式必须注意“活学活用”,设计模式不是教条,而是思路,生搬硬套设计模式还不如不用。打下牢固的程序设计语言基础、夯实自己的编程思想、修炼开发内功才能游刃有余地使用设计模式。有的时候,或许你根本不...
  • YANG_Gang2017
  • YANG_Gang2017
  • 2017年12月01日 19:39
  • 258

java设计模式学习汇总

1.什么是设计模式 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设...
  • tomcat_2014
  • tomcat_2014
  • 2017年03月07日 10:33
  • 628

学习Java设计模式的10条建议

设计模式在整个Java的学习路线图中有着承上启下的作用。
  • printj
  • printj
  • 2014年07月28日 15:11
  • 1082

设计模式学习的几点建议

如如何才能更好地抓住设计思想和本质? 深入理解和多加实践。建议大家的一种模式学习流程如下:先通过一些生活实例引入某种设计模式,然后学习该模式的动机、定义和结构,再学习一两个使用该模式的典型实例,接下...
  • LZQ19931007
  • LZQ19931007
  • 2016年04月12日 14:42
  • 1203

学习设计模式的一些看法

老驴拉磨似的,磨着磨着终于来到设计模式部分的学习了。因为C++和自考的原因,计算机方面的学习进度还是比较慢。(有给自己找借口的嫌疑……)那么,刚刚进入设计模式的学习——简单工厂模式和策略模式。这已经是...
  • zhuojiajin
  • zhuojiajin
  • 2013年04月09日 16:07
  • 1343

浅谈自己学习设计模式的感受

对于开发工作者的世界,不管是开发讨论会上还是学习交流会上,更或者面试的时候,当提及设计模式,都会或多或少的让别人高看你一眼。为什么它会有这么强大的魅力呢!...
  • itest_2016
  • itest_2016
  • 2017年09月13日 11:37
  • 858

设计模式学习总结

引子刚开始学习设计模式的时候,感到这些模式真的非常抽象。今年下半年以来,随着我们组工作重点的转移,以及我在小组中角色的变化,我开始有条件提出自己对新系统的设计想法。在设计过程中,我发现了很多设计模式的...
  • shanliwa
  • shanliwa
  • 2007年10月23日 15:33
  • 8247

设计模式学习顺序

准备今后一段时间安排学习一下设计模式,其实大家都说学习编程要多写程序,可是自己的想法是想要从学习设计模式的方面提高自己的代码设计水平,因为现在自己只能在懂得了C++的基本的语法上,做一些垒代码的工作,...
  • anbreakdy
  • anbreakdy
  • 2016年10月01日 11:34
  • 245

关于设计模式感想

学习模式是一个漫长的过程,应该明确的认识到设计模式的意义在哪里,我们学起来才会更加具有针对性,而不是为了设计模式而设计模式。最近看到一段话感觉挺有意思的: 计算机的强大在于它不知道疲倦,他的计算力持...
  • micro_hz
  • micro_hz
  • 2016年05月24日 17:01
  • 621

为什么我们要学习设计模式

转自:http://zhuanlan.zhihu.com/vczh-nichijou/19835717?utm_campaign=rss&utm_medium=rss&utm_source=rss&u...
  • yangxuehui1990
  • yangxuehui1990
  • 2015年01月09日 17:43
  • 392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习(2)
举报原因:
原因补充:

(最多只允许输入30个字)