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

所需积分/C币:9 2012-06-07 11:42:16 2.03MB PDF
0
收藏 收藏
举报

设计模式经典书籍,真正的深入浅出, 软考中的题目都是从这里面找的额...
中国互动出版网 www.china-pub.com 田上书店独家提供样章 现在我们得让鸭子能飞 主管们确定,此模拟程序需要会飞的鸭子来将竞争者抛在 后头。当然,在这个时候,Joe的经理拍胸脯告诉主管们, Joe只需要一个星期就可以搞定。“毕竟,Joe是一个00程序 这有什么困难?” 我只需要在Duck类中加上 flyO方法,然后所有鸭子都会继承 flyQ。这是我大显身手,展示00才 华的时候了。 我们想要的 Duck quack SwIm 士朝身」 display fly Joe加上的 帐 ∥鸭子的其他方法…… 类 0)A[J准 Mallard duck Redhead duck 其他的鸭子类型… display i display(t ∥外观是绿头} ∥外观是红头} 你现在的位置3 中国互动出版网 www.china-pub.com 田上书店独家提供样章 但是,可怕的问题发生了 Joe,我正在股东会议上, 刚刚看了一下展示,有很 多“橡皮鸭子”在屏幕上飞来飞去 这是你在开玩笑吗?你可能要开始去逛 逛Monster.com(编注:美国最大的求职 网站)了 么回事 Joe忽略了一件事:并非Duck所有的子 类都会飞。Joe在Duck超类中加上新 好吧!我承认设计中有一点小 sidD程序中有了一个无生命的会(有题的、“参、么不干脆把 的行为,会使得某些并不适合该行为疏失。但是,他们 的子类也具有该行为。现在可好了 这当成一种 其实还挺 飞的东西。 对代码所做的局部修改,影响层面可 不只是局部(会飞的橡皮鸭)! 他体会到了一件 事:当涉及“维 护”时,为了“复 Duck 用”( reuse)目 quack( ()AIJ丁中亲群 swIm 的而使用继承 张士身拍子 display 结局并不完美。 一0AJ首y ∥鸭子的其他方法 Mallardduck Redheadduck Rubberduck 哪哪叫,所 的定 display t display(t quack i 把 quack ∥外观是绿头 ∥外观是红头 ∥覆盖成吱吱叫 义覆盖成“吱吱 (sque ak) displays ∥外观是橡皮鸭 中国互动出版网 www.china-pub.com 田上书店独家提供样章 Joe想到继承 我可以把橡皮鸭类中 可是,如果以后我加入诱 的fy()方法覆盖掉,就好像 饵鸭( Decoy duck),又会 覆盖 quack()的做法一样… 如何?诱饵鸭是木头假鸭,不 会飞也不会叫 Rubberduck quack(){∥吱吱叫} display(){∥橡皮鸭 fy(0{ ∥覆盖,变成什么事都不做 Decoy Duck quack o i ∥覆盖,变成什么事都不做 这是继承层次中的另一个 display(){∥诱饵鸭} 类。注意,诱饵鸭既不会飞 fy0){ 也不会叫,可是橡皮鸭不会∥覆盖,变成什么事都不做 飞但会 Sharpen your pence 利用继承来提供Duck的行为,这会导致下列哪些缺点?(多选) qA.代码在多个子类中重复 qD.很难知道所有鸭子的全部行为。 qB.运行时的行为不容易改变。 qE.鸭子不能同时又飞又叫。 qC.我们不能让鸭子跳舞。 qE.改变会牵一发动全身,造成其他鸭子不想 要的改变 你现在的位置5 中国互动出版网 www.china-pub.com 田上书店独家提供样章 利用接口如何 Joe认识到继承可能不是答案,因为他刚刚拿到来自 主管的备忘录,希望以后每六个月更新产品(至于 我可以把fly()从超类中取出来, 更新的方法,他们还没想到)。Joe知道规格会常常 放进一个“ Flyable接口”中。这 改变,每当有新的鸭子子类出现,他就要被迫检查(么一来,只有会飞的鸭子才实现此 并可能需要覆盖fy(和 quark……这简直是无穷无 接口。同样的方式,也可以用来设计 尽的噩梦。 个“ Quackable接口”,因为不是所有 的鸭子都会叫 所以,他需要一个更清晰的方法,让“某些”(而 不是全部)鸭子类型可飞或可叫 Duck Quackable 「 Flyable quack( display fy/0) ∥鸭子的其他方法… Mallardduck Redhead duck Rubberduck DecoyDuck display display fly fly quack quack o qua 你觉得这个设计如何 中国互动出版网 www.china-pub.com 田上书店独家提供样章 这真是一个超笨的主意,你没发现这 么一来重复的代码会变多吗?如果你 认为覆盖几个方法就算是差劲,那么对于 48个Duck的子类都要稍微修改一下飞 行的行为,你又怎么说?! 如果你是Joe,你要怎么办? 我们知道,并非“所有”的子类都具有飞行和呱呱叫的行为,所以继承 并不是适当的解决方式。虽然 Flyable与 Quackable可以解决“一部分”问 题(不会再有会飞的橡皮鸭),但是却造成代码无法复用,这只能算是 从一个恶梦跳进另一个恶梦。甚至,在会飞的鸭子中,飞行的动作可能 还有多种变化 此时,你可能正期盼着设计模式能骑着白马来解救你离开苫难的一天 但是,如果直接告诉你答案,这有什么乐趣?我们会用老方法找出一个 解决之道:“采用良好的00软件设计原则”。 如果能有一种建立软件的方 法,好让我们可以用一种对既有 的代码影响最小的方式来修改软件该有 多好。我们就可以花较少时间重做代码, 而多让程序去做更酷的事 你现在的位置7 中国互动出版网 www.china-pub.com 田上书店独家提供样章 软件开发的一个不变真理 好吧!在软件开发上,有什么是你可以深信不疑的? 不管你在何处工作,构建些什么,用何种编程语言,在软件开发上,一直伴随你的那个不变真 理是什么? 彐WAH3 用镜子来看答案) 不管当初软件设计得多好,一段时间之后,总是需要成长与改变 否则软件就会“死亡”。 a sharpen your penci 驱动改变的因素很多。找出你的应用中需要改变代码的原因, 一列出来。(我们写下了一些我们的原因,给你起个头。) 我们的顾客或用户需要别的东西,或者想要新功能。 我的公司决定采用别的数据库产品,又从另一家厂商买了数据,这造成数 据格式不兼容。唉! 8第1章 中国互动出版网 www.china-pub.com 田上书店独家提供样章 把问题归零 现在我们知道使用继承并不能很好地解决问题,因为鸭子的行 为在子类里不断地改变,并且让所有的子类都有这些行为是不 恰当的。 Flyable与ρ uackable接口一开始似乎还挺不错,解决 了问题(只有会飞的鸭子才继承 Flyable),但是Java接口不具 有实现代码,所以继承接口无法达到代码的复用。这意味着 无论何时你需要修改某个行为,你必须得往下追踪并在每一个 定义此行为的类中修改它,一不小心,可能会造成新的错误! 幸运的是,有一个设计原则,恰好适用于此状况。 把会变化的部分取出 并“封装”起来,好让其 设计原则 他部分不会受到影响。 找出应用中可能需要变化之处,把它 们独立出来,不要和那些不需要变化{ 的代码混在一起。 结果如何?代码变化引起 的不经意后果变少,系统 这是我们的第一个设计原则,以 后还有更多原则会陆续在本书中 变得更有弹性 出现。 换句话说,如果每次新的需求一来,都会使某方面的代码发生 变化,那么你就可以确定,这部分的代码需要被抽出来,和其 他稳定的代码有所区分。 下面是这个原则的另一种思考方式:“把会变化的部分取出并 封装起来,以便以后可以轻易地改动或扩充此部分,而不影响 不需要变化的其他部分 这样的概念很简单,几乎是每个设计模式背后的精神所在。所 有的模式都提供了一套方法让“系统中的某部分改变不会影响 其他部分” 好,该是把鸭子的行为从Duck类中取出的时候了 你现在的位置9 中国互动出版网 www.china-pub.com 田上书店独家提供样章 分开变化和不会变化的部分 从哪里开始呢?就我们目前所知,除了f1yQ和 quack的问题之外,Duck类还算一切正常,似乎 没有特別需要经常变化或修改的地方。所以,除了某些小改变之外,我们不打算对Duck类做太 多处理 现在,为了要分开“变化和不会变化的部分”,我们准备建立两组类(完全远离Duck类) 个是“f1y”相关的,一个是“ quack”相关的,每一组类将实现各自的动作。比方说,我们可 能有一个类实现“呱呱叫”,另一个类实现“吱吱叫”,还有一个类实现“安静”。 我们知道Duck类内的fly(和 quack(会随着鸭子的不同而改变。 为了要把这两个行为从Duck类中分开,我们将把它们从Duck类 中取出来,建立一组新类来代表每个行为。 Duck类仍是所有鸭子的超类, 但是飞行和呱呱叫的行为已 现在飞行和呱呱叫都有它们 多种行为的实现被放 经被取出,放在别的类结构 自己的类了 在这里。 中 取出易于变化的部分 行行为 子类 圆叫行为 鸭子行为 10第1章

...展开详情
试读 21P 设计模式深入浅出(Head First 设计模式中文)
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
    最新推荐
    设计模式深入浅出(Head First 设计模式中文) 9积分/C币 立即下载
    1/21
    设计模式深入浅出(Head First 设计模式中文)第1页
    设计模式深入浅出(Head First 设计模式中文)第2页
    设计模式深入浅出(Head First 设计模式中文)第3页
    设计模式深入浅出(Head First 设计模式中文)第4页
    设计模式深入浅出(Head First 设计模式中文)第5页

    试读结束, 可继续读2页

    9积分/C币 立即下载 >