Chapter 1 Intro to Design Patterns

It started with a simple SimUDuck app
作者以一个鸭子游戏为例展开叙述,很普通,它也选择设计一个抽象父类Duck,该父类具有鸭子普遍具有的特征,其下有若干个鸭子子类。
But now we need the ducks to FLY
众所周知鸭子怎么会飞呢,顶多就是扑腾两下而已。由于原来的父类中并没有fly()这个方法,所以要添加进去,程序员想这都不是事,于是他这样做了。
But something went horribly wrong...
这的确是正常的想法,但是他没想到Duck的子类中有一个橡胶鸭子RubberDuck,假鸭子怎么可能会飞呢。
从这一点可以看出来当你往父类中添加方法时一定要谨慎,因为不是所有子类都能接受该方法。
Joe thinks about inheritance...
程序员想到用覆盖父类fly方法的办法解决这一问题,不过每增加一个类似的子类就要覆盖一次,这个比较麻烦。
How about an interface?
既然如此还不如使用一个接口,如果子类确实用得着接口中的方法的话,子类自己去实现就好了嘛。
What would you do if you were Joe?
从实际效果可以看出,并不是所有子类都需要fly方法,即使需要各种鸭子的fly方法也不尽相同,你需要分别实现,因此继承的策略并适用于这种情况。
这对维护来说是个噩梦。
我们需要一种尽量少改动已有代码,花尽量少的时间的解决方案。
没有哪个软件设计能够亘古不变,它必须是与时俱进的,即,软件必须具有可扩展性。
继承不适合那些各个子类行为不同的和父类的某些行为有些子类不具有的情况。如果你想用继承来解决这些问题,那必须更改现有的设计,谁知道会不会在更改的过程中引进bug呢o(╯□╰)o。
于是这引出了软件设计中的一条原则:
把变化的和不变的分开处理
这个原则也可以这样理解:封装变化的方面,以便在不影响不变的方面的情况下更改或扩展变化的方面。
按照这一设计原则,作者把那些在子类中表现不同的行为抽取出来单独写成了类,有几个这样的行为就写几个这样的类。
为了让鸭子的行为能够动态的改变可以在DUCK类中添加setter这样就可以在runtime中设置鸭子的行为了。
面向接口编程而非过程
以前我们的行为方式是或者让父类实现一个通用的行为,或者如果这个通用的行为不合适了,就在子类中重新写一个。这种模式叫做依赖于实现的编程模式,他没有为改变行为提供自由度。
面向接口编程就是首先选择你想要的行为,然后你自己去实现。
面向接口编程就是面向父类类型编程
这其实说的就是多态。
它可以让不用关心具体的类型,它可以让你的注意力放在抽象类型上,具体是哪个类型留到运行时再决定。
这样做的好处是除了鸭子以外其他有这种行为的对象都可以去实现这个接口,而且能做到不改变原来父类Duck的任何东西。
我感觉面向接口编程就是把关注点集中在功能的组织上而不局限于具体的实现,这避免了只见树木不见森林的窘境。
为了实现这种动态绑定,作者在父类Duck中引入了interface类型的变量,毫无疑问这只不过是个接口,程序不运行它啥也不是,只有程序运行了它才能知道用哪个方法。作者在Duck中写了一个飞行行为的方法,很简单,它直接调用了该interface类型的变量的飞行行为,因为该行为是抽象的,它会在运行时确定,所以这就实现了动态绑定。
子类通过继承Duck仍然继承了fly和quack行为,但是这次继承的却是抽象的行为,它会因子类的不同而不同。继承的优势就是代码的重用,因此抽象行为的继承也具备这种优势,而将各种行为独立开来又具备了动态特性,此外抽象的继承体系还能像外界提供统一的接口(父类类型),所以这种设计实在是一举多得。
我在想即使你在父类Duck中放置了存取器,那我还不要手动去调用它们去控制具体的行为吗,难道这就是所谓的动态?或许我对动态概念的理解更偏向于自动化。
所谓动态的概念其实是半自动化,它仍然或多或少地需要手动操作,但是这比完全的手动控制要轻松得多。
HAS-A can be better than IS-A
这是个经验之谈,也是非常重要的设计原则。
1、它能让你实现很好地实现内部细节的封装。
2、它也能让你控制运行时行为。
The Strategy Pattern
它定义了一系列算法,并把它们分别封装,并使它们可被更改,它使这些算法对用户而言是不可见的。
设计模式可以让你具有其他开发人员具有的设计思想,以便于你与他们之间的沟通协作。因为人家一听到某个具体的设计模式马上就知道你是怎么实现的,它形成了一种共鸣,就是有共同语言嘛。
好的设计专家想的是如何设计一个便于维护和扩展的系统。
好的OO设计是可重用的、可扩展的和可维护的。
大多数的设计模式允许系统中的某部分独立地改变而不影响其他。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容