- 1、本文档共25页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Head First Design Patterns(深入浅出设计模式)-设计模式介绍
1.???? Welcome to Design Patterns -
现在我们要住进对象村(Objectville),我们刚刚开始接触设计模式…每个人都在使用它们。一会我们将去参加Jim和Betty的星期三晚上的模式聚会!
有人已经解决了你的问题。在这章里,你将学习到为什么(和怎么样),
?
-1-
?
从一个简单的模拟鸭子程序开始
乔为一个制造非常成功的模拟鸭子池塘游戏(SimUDuck)的公司工作。这个游戏可以展示很多种鸭子的游泳方式和呷呷叫声。系统最初的设计者们使用了标准的面向对象技术,他们创建了一个Duck基类供所有其它类型的鸭子继承。
去年,竞争者们给公司带来了越来越多的压力。经过历时一周在高尔夫球赛场上的集体讨论,公司的经理们都觉得该是进行一次大改革的时候了。他们需要在下周在毛伊岛举行的股东大会上展示一些真正给人深刻印象的东西。
?
-2-
?
但是我们现在需要鸭子可以飞
经理们确定会飞的鸭子就是模拟器需要的用来击败其他竞争者的东西。当然,乔的经理告诉他们,对于乔来说在一周内迅速搞定这些根本不是问题。“毕竟”,乔的上司说,“他是一个面向对象的程序员…那些有什么难的呢?”
乔想:我仅仅只需要在Duck类里增加fly()方法,然后所有其他鸭子就都可以继承它了。现在是展示我真正的面向对象才华的时候了。
?
-3-
?
但是有些事情严重错误了…
乔的上司:乔,我正在股东大会上。他们刚看完演示,很多橡皮鸭子在屏幕上四处乱飞。这是你在开玩笑吗?…
发生了什么事?
乔没有注意到并不是所有Duck的子类都需要fly()方法。当乔给Duck基类增加新行为的时候,他也同时给那些不需要这些行为的Duck的子类增加了。现在他的SimUDuck程序里有了会飞的不存在的东西。
局部的代码更新导致了非局部的效果(会飞的橡皮鸭子)!
乔想:好吧,我的设计有一点小缺陷。我不明白为什么他们不能只部分调用它。…
他在想为什么在维护系统的时候无法使用继承来实现重用的目的。
?
-4-
?
乔在考虑继承…
乔想:我可以总是在橡皮鸭子里覆盖fly()方法,同样的方式对于quack()方法…
乔想:但是当我们在系统里增加木头鸭子的时候会怎么样呢?它们既不会飞也不会呷呷叫…
?
下面那些是使用继承来给Duck增加行为的不利条件?(可多选)
A.???? 代码在子类间被复制
B.???? 很难在运行时改变行为
C.???? 我们不能让鸭子跳舞
D.???? 很难得到所有鸭子的行为
E.????? 鸭子不能在同一时间飞和呷呷叫
F.????? 变动会无意间影响其他鸭子
?
-5-
?
利用接口(interface)怎么样?
乔认识到继承或许并不是办法,因为他刚得到消息说经理们现在想每六个月更新一次产品(他们还没有想好更新什么)。乔知道那样意味着不断变化,并且他将被迫检查所有将来增加到程序里的Duck的子类,可能还要覆盖它们的fly()方法和quack()方法。
乔想:我可以把fly()从Duck基类里拿出来,然后创建一个有fly()方法的Flyable()接口。这样,只有那些需要飞的鸭子才会通过实现这个接口来获得fly()方法…并且,我想最好再创建一个Quackable接口,因为并不是所有的鸭子都会呷呷叫。
你觉得这个设计怎么样?
?
-6-
?
如果你是乔,你会怎么办?
乔的经理:这是你提出过的最糟糕的主意。你怎么能说“复制代码”呢?如果你能想到被迫覆盖一些方法是不好的,那么你为什么不考虑一下当你需要对飞行行为做一点小的改动的时候会怎么样 … 对于所有48个能够飞行的Duck的子类来说?!
?
我们知道并不是所有的子类都有飞行和呷呷叫的行为,所以继承不是正确的方法。但是,尽管让子类实现Flyable或者Quackable解决了部分问题(不会再有会飞的橡皮鸭子),但是这种方法彻底破坏了行为的重用,所以它只是制造了另一个维护上的噩梦。当然,鸭子可能有一种以上的飞行行为…
此刻你可能正等待着有一个设计模式骑着白马来拯救世界。但是,那会是什么?不,我们将使用传统的方式来找到解决方案 – 使用优秀的面向对象软件设计原则
美女在想:如果一种软件开发方法,使我们可以用一种对现有代码影响最少的方式来修改软件,那不是在做梦吧?那样我们就可以花很少的时间来修改软件而有更多的时间给程序增加更酷的功能…
?
-7-
?
软件开发的一个不变的真理
好的,什么是你在软件开发中经常要注意的事情?不论你在那工作,你在建造什么,或者你在使用什么开发语言,什么东西一直在伴随着你?
不论你设计的程序有多好,随着时间的推移,一个程序都会改变的,或者它会死掉。
很多事情都会促使变化。在列表上写出一些你
文档评论(0)