《第1章设计模式入门》随想

这一章在讨论的问题

Using inheritance hasn't worked out very well, since the duck behavior keeps changing across the subclasses, and it's not appropriate for all subclasses to have those behaviors.

swim()quack()方法的讨论

鸭子分为两类,一类是生物鸭子,一类是模拟鸭子。

情况一

假设生物鸭子的swim()quack()方法都是一样的;
假设模拟鸭子的swim()quack()方法都是特殊的。
那么相应的类图如下:

鸭子有两个抽象子类

Duck中的swim()quack()都是抽象方法。

情况二

假设生物鸭子的swim()quack()方法都是一样的;
假设一部分模拟鸭子的swim()quack()方法跟生物鸭子一样,一部分是特殊的。
如何重用鸭子中的swim()quack()方法?是不是要把swim()quack()的实现放到一个类中呢?

如果模拟鸭子的`swim()`和`quack()`方法跟生物鸭子一样就继承`AbtractCommonDuck`,否则继承`Duck`

所有的生物鸭子都继承AbtractCommonDuck,如果模拟鸭子的swim()quack()方法跟生物鸭子一样就继承AbtractCommonDuck,否则继承Duck

情况三

假设鸭子的swim()quack()方法都是一样的;
假设模拟鸭子的swim()quack()方法都是一样的,但是跟鸭子的不一样。
那么相应的类图如下:

两个子类有各自的实现

总结

假设生物鸭子swim()quack()方法也是有特殊情况的话,那么模拟鸭子和鸭子的组合就有很多种情况了,但是我是不会因为要重用swim()quack()这个两个方法就把类图搞得乱七八糟的,对于我来说,类图就应该这样设计:

只分鸭子和模拟鸭子子类

为什么要这样?因为鸭子就是这样分类的,软件是在模拟现实,而且这样的分类对大家来说都是通俗易懂的。
对于swim()quack()方法的具体实现我会放在Duck,或者是两个子类中。
对于书中的只有Duck类也是可以的,即不区分生物鸭子和模拟鸭子:
所有的鸭子都是鸭子

fly()quack()方法的讨论

在父类Duck中添加fly方法本身就是不适合的。我们必须明确飞行能力并非所有鸭子都有,比如橡皮鸭子就不具有飞行能力,所以把fly()放在父类中是否合适就很值得商榷。

`Duck`中只有共用的方法,其他的方法子类通过实现接口来实现

是否要把fly()quack()加入Duck?

可是加进去之后如果以后鸭子的行为有增加或删除,那么这个类体系中的所有类都要进行修改。 ,以下是书中

所有的鸭子都是鸭子

大家觉得合适吗?明明有些鸭子没有飞行的能力,你却给它加入了飞行的能力。
我认为可以从几个角度进行思考:
1.这是一款鸭子应用,不管有多少种鸭子,都不会突然冒出一只鸡;用户、系统所应对的都是鸭子,没有其他任何东西,这对于该系统来说是最简单的;即使以后鸭子有了其他行为,比如跑步的方法,改起来是很痛苦的,但是对于系统和用户来说,他们都只需要应付鸭子这个接口,无需理会其他事情。
2.这是一个很糟糕的设计,如果有新种类的鸭子加入,你就可能需要修改整个类体系,这跟一开始的做法有什么区别?但是问题是我拥有一只鸭子,我知道它能不能飞呢?我不知道,于是我这样使用:

((FlyBehavior)duck).fly()

你喜欢这种方式吗?你喜欢你的系统到处都需要进行这种检查吗?

到底是什么在变化?

鸭子的种类有很多,每种鸭子的行为是不可预测的。

这一章的内容导读

继承——现在我们得让鸭子能飞

在《但是,可怕的问题发生了》只是说明“对代码所做的局部修改,影响层面可不只是局部”,“当涉及“维护”时,为了“复用”目的而使用继承,结局并不完美”。
继承的问题是必须确保父类中的实现对子类来说是合适的,所以必须仔细检查从父类中继承过来的行为是否是恰当的。

Joe想到继承

继承的缺点

这里使用继承最大的缺点就是代码在多个子类中重复

运行时的行为不容易改变倒不是什么大问题,因为一种鸭子的行为一般都是固定的,一个鸭子不可能会横着飞又会竖着飞,难不成是钢铁侠?

改变会牵一发动全身,造成其他鸭子不想要的改变。由于实现是在父类中的,如果父类改变了它的实现,所有继承并没有重写该实现的鸭子都会受到波动,如果你不清楚有哪些子类没有重写该方法,那么就会有隐藏着的问题出现。

很难知道所有鸭子的全部行为

  • 这个真的不知道在说什么,使用策略模式就知道鸭子的全部行为了吗?我想它的意思是如果我知道鸭子的全部行为的话,就可以跟我在《 对swim()quack()方法的讨论》中讨论的一样,我们可以实现很多个抽象子类(就不会导致代码在多个子类中重复),可惜我们不知道。或者是另外一个意思,我不知道鸭子的全部行为,所以我不能在父类中把这些行为都写上,然后根据鸭子的种类判断执行那个操作。(说多都是泪,根本就看不懂。)
  • 第二种解释是我不知道所有鸭子的全部行为,所以如果我改变了父类中的实现,我不清楚会对哪些子类会产生影响。
  • 第三种解释是我不清楚所有鸭子的全部行为,
    书中在说继承的缺点,但是却并不是说这样设计类是不对的,Duck类是一定要包括所有种类的鸭子的行为的,而是说使用继承,不能解决代码重复的问题。

利用接口如何?

每当有新的鸭子子类出现,他就要被迫检查并可能需要覆盖fly()和quark().....这简直是无穷无尽的噩梦。

因为子类继承了父类的行为,所以每个子类都必须好好检查这些行为的实现,如果不适当就必须进行修改,万一忘记修改了,就会导致子类继承了父类不恰当的行为。

使用接口

并非“所有”的子类都具有飞行和呱呱叫的行为,所以继承并不是恰当的解决方式。

在父类中的实现会被子类继承,如果子类没有好好检查并覆盖父类中的方法,就可能会导致不恰当的行为被继承下来。

针对接口编程

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

推荐阅读更多精彩内容

  • 模拟鸭子游戏的需求 SimUDuck游戏中会出现各种鸭子,一边游泳戏水,一边呱呱叫。通过标准的OO技术,设计一个超...
    一缕阳忆往昔阅读 456评论 2 0
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,743评论 3 13
  • 客户需求 程序设计 1、直接利用继承如何? 将以上四种行为全部写到Duck这个基类中,然后子类重写飞和叫的行为。但...
    BlainPeng阅读 464评论 2 7
  • 文/一土 当喜欢一个人的时候,会挖空心思记住她喜欢的一切,也包括她喜欢别的男人。这些还不够,还要去了解她不喜欢的一...
    雨下撒哈拉阅读 220评论 0 0
  • 近来虽然写了不少育儿文章,但是事实上我的底子非常单薄:女儿出生时,我没文凭、没能力、没自信、没笑脸,堪称四大没人。...
    如水如沐阅读 389评论 6 6