父类

class Duck{void quack();void swim();void fly();void display();
};

子类

  • 覆盖父类的display()函数,实现自己的display(),每种鸭子都有自己的外观特征
  • 继承父类的quack()、swim()、fly()
class MallardDuck : public Duck {void display() {// 外观是绿头}
};
class RedheadDuck : public Duck {void display() {// 外观是红头}
};

问题

  1. 并不是所有的鸭子都会飞,橡皮鸭子就不会飞, 诱饵鸭不会飞
  2. 并不是所有的鸭子都会叫,诱饵鸭就不会叫

所以子类直接继承父类的fly()和swim()是不合适的。

解决方案

  1. 在和父类不同时,子类覆盖掉父类的fly()和swim(),实现自己的fly()和swim()

    • 该方案存在的问题

      • 代码在多个子类中重复,可能多个子类的fly()相同,但是与父类的不同,不得不在每个子类中都实现一个相同的fly()
      • 运行时的行为不容易改变,如果一只鸭子刚开始是咕咕叫,后来变成过呱呱叫,该怎么办?
      • 很难知道所有鸭子的全部行为,父类可能不囊括鸭子的所有有行为
      • 改变会牵一发动全身,造成其他鸭子不想要的改变
class RubberDuck : public Duck{void fly() {// 覆盖掉父类的fly(), 变成什么时都不做}
};
class DecoyDuck : public Duck {void fly() {// 覆盖,变成什么事都不做}void quack() {// 覆盖,变成什么事都不做}
};
  1. 把fly()从超类中取出来放进一个"Flyable接口"中。同样的方法,把quack()从超类中取出来放进一个"Quackable接口"。

    • 这么一来,只有会飞的鸭子才实现"Flyable接口"。只有会叫的鸭子才实现"Quackable()"
    • 代码难以复用,每种鸭子都得实现自己的fly()或wim。当有很多鸭子的实现方式一样时,会出现很多相同的代码。只是从一个噩梦跳到另一个噩梦中。
  2. 分开变化和不会变化的部分。
    • 准备两组类(完全远离Duck类),一个是"fly"相关的,一个是"quack"相关的,每一组都实现各自的动作。
    • 接口"Flyable", 具体实现由子类完成。(“Quackable类似”)
    • 在Duck类中,加入两个实例变量,分别为"Flyable()“和"Quackable()”
    • 分析优势
      • 鸭子类中只使用了接口,没有实现,代码得到了复用
      • 还可以在运行时改变状态,赋值一个新的子类对象给Flyable接口或Quackable接口即可。
      • 当需要添加新的飞行方式或叫的方式时,只需要继承接口,在子类中实现即可。Duck类不需要做任何改动。

设计原则1

找出应用中可能需要的变化之处,把它独立出来,不要和那些需要变化的代码混在一起

设计原则2

针对接口编程,而不是针对实现编程

原则3

多用组合,少拥继承

Head first设计模式 第1章阅读笔记相关推荐

  1. 西瓜书第三章阅读笔记

    西瓜书第三章阅读笔记 第三章 线性模型 1.机器学习三要素 2.基本形式 3.线性回归 3.1 模型 3.2 策略 3.3 求解算法 4.对数几率回归 4.1 模型 4.2 策略 4.3 求解算法 5 ...

  2. 西瓜书第四章阅读笔记

    西瓜书第四章阅读笔记 1.基本概念 1.1 基本算法 1.2 信息熵 1.3 信息增益 2.ID3决策树 3.C4.5决策树 4.CART决策树 5.剪枝操作 6.连续与缺失值处理 7.多变量决策树 ...

  3. 西瓜书第一章阅读笔记

    西瓜书第一章阅读笔记 第一章 绪论 1.机器学习基本术语 2.归纳偏好 3.所有学习算法一样优秀? 4.补充资料 第一章 绪论 1.机器学习基本术语 记录:对一个事件或对象的描述,也称为"示 ...

  4. 西瓜书第二章阅读笔记

    西瓜书第二章阅读笔记 第二章 模型评估与选择 1.经验误差与过拟合 2.模型评估方法 2.1 留出法 hold out 2.2 交叉验证法 cross valildation 2.3 自助法 boot ...

  5. Introduction to modern cryptography 第一章阅读笔记

    文章目录 前言 1.1 密码学以及现代密码学 1.2 私钥密码的设定 (1) 一些定义 (2) 密码方案的语法 (3) Kerckhoffs原理 1.3 一些密码方案 (1) Caesar's cip ...

  6. PCGBooK第一章 阅读笔记

    本文是对pcgbook(http://pcgbook.com/)的阅读笔记,笔者如果出现错误,欢迎指正 1.1 PCG的定义 PCG,基于过程式内容生成(procedural content gene ...

  7. 《现代前端技术解析》第4-5章 阅读笔记

    第四章 现代前端交互框架 (需要进行理解,再完善笔记) ​ 数据的处理和操作的核心就是DOM的处理和操作,即便是今天,所有前端JavaScript框架最终要解决的仍然是如何实现高效,高性能DOM交互操 ...

  8. 大道至简第五章阅读笔记

    这次第五章的内容谈到了工程的实质内容,那就是做工程做项目的过程.在一个项目中,理解了客户的需求之后就该分析具体的实施计划,很多人总是会做瀑布模型然后按照模型的样子去做完过程的每一个阶段,但是每个阶段又 ...

  9. 大道至简第一章阅读笔记

    大道至简的第一章中开头就举出了一个家喻户晓的故事-愚公移山,这个故事可以很容易的看出原始需求,即:"惩山北之塞,出入之迂",项目目标:"毕力平险,指通豫南,达于汉阴&qu ...

最新文章

  1. mysql 绑定参数_MySQL 使用 Perl 绑定参数和列
  2. Nginx 主要应用场景
  3. 如何在 ASP.Net Core 中使用 条件中间件
  4. 把寄存器做成一个结构体,赋值初始地址后寄存器赋值的操作
  5. 系统相机裁剪比例_如何正确设置相机:6个最常见的错误,你还在犯错吗?
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的宿舍管理平台系统
  7. java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet...
  8. 6LoWPAN Header compression
  9. 【洛谷】 3264 [JLOI2015] 管道连接
  10. flightgear基于udp用c++传输信息
  11. wordpress函数手册_WordPress中文手册文档
  12. 【译】基于 Rust 用 Bevy 实现节奏大师游戏
  13. 算法艺术(一):Hello world
  14. HTML5支持rpx,css小程序的元素尺寸单位px,rpx及rem
  15. UE4 解决半透明材质显示错误
  16. 深度学习实战22(进阶版)-AI漫画视频生成模型,做自己的漫画视频
  17. mysql时间函数之hour,minute,second用法_前进的火车_新浪博客
  18. 怎样提取音频制作手机铃声
  19. cisco3560及二层交换机配置vlan及常用命令
  20. 毕业设计-基于JSP的网上购书系统.doc

热门文章

  1. 记录:使用阿里云视频点播Vod实现上传本地视频
  2. 登月者请注意:月球微生物潜在的惊人可能性
  3. 带有Softaculous功能的美国主机怎么样?
  4. 学习记录:USART—串口通讯
  5. java的getshape()_World Wind Java开发之六——解析shape文件(转)
  6. 通过Navicat快速更改数据库名称
  7. 转贴:《玻璃球游戏》的规则
  8. 使用jedis连接redis-cluster模拟缓存击穿,穿透,雪崩场景
  9. element-ui 使用分享
  10. DIV+CSS网页布局实例