[TOC]
2017年12月1日
1. 鸭子类通过继承产生其他的鸭子.
通过集成实现鸭子类的扩展.png2. 利用接口分离叫的能力和飞的能力
这样使得橡皮鸭子不会飞也不会叫了达到了我们的目的.
如果有会叫的橡皮鸭子你可以让它实现这个接口就行了.
用最小的改动来修改软件.png
3. 把问题归零
- 集成并不能很好的解决问题,在鸭子类不断改变的情况下,让所有的鸭子具有相同的行为是不恰当的.
- 接口也不尽如人意.因为接口不具有实现方法,实现接口并不能达到代码复用的目的.
第一个设计原则横空出世
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起.
所有的模式都提供了一套方法: 系统中的某部分改变不会影响其他部分
4. 针对接口编程(针对超类型编程)
变量的声明类型应该是超类型(supertype),超类型通常是一个 抽象类或者接口,这样, 只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量.
使用Animal这个超类变量对Dog子类进行动态调用.png第二个设计原则
针对接口编程,而不是针对实现编程.
5. 总结陈词
-
通常在系统设计的时候,预先考虑有哪些地方未来可能需要变化,于是提前在代码中加入这些弹性. 原则与模式可以应用在软件开发生命周期的任何阶段.
-
上面的"鸭子类"的例子中,我们用一个类代表一个行为,其实是符合OO系统的特性的.因为在这个例子中,碰巧"东西"是个行为.但是,即使是行为,也仍然可以有状态和方法,例如,飞行的行为可以具有实例变量用来记录飞行的行为属性(扇动翅膀的速度和飞行高度等.)
6.练习题
- 使用我们新的设计, 如果你要加上一个火箭动力的飞行动作到SimUDuck系统中,你该怎么做?
答: 创建一个RocketEngineFly类实现FlyBehavior接口,实现fly()方法.最后fly()方法里调用火箭动力飞行的方法.
- 除了鸭子之外,你能够相处什么类会需要用到呱呱叫的行为?
答: 1. 大鹅 2. 青蛙
7. 这个模式的本质
Duck类具有飞和叫的行为,但是它本身不做这些行为,而是委托(delegate)给两个接口FlyBehavior和QuackBehavior接口做这两个动作.
8. 具有动态行为的鸭子
针对Duck超类中的 flyBehavior和quackBehavior两个变量,我们给他们分别加上set方法.这样就能在执行时动态设置行为 ,只需要调用set方法就行了传入相应的行为实现类的实例作为参数.
提供set方法.png9. 封装行为的大局观
至此,我们完成的Duck类的封装工作,接下来我们来看一下Duck类整体结构.
第三个设计原则
多用组合,少用继承.
10. 第一个设计模式-策略模式(Strategy Pattern)
策略模式定义了算法族,分别封装起来,让他们之间可以互相替换.此模式让算法的变化独立于使用算法的客户.
11. 我如何使用设计模式?
- 在开发人员的圈子里,设计模式相当于共享语言.当你对你设计的系统进行描述的时候,只需要说明你用了什么设计模式,大家就都明白你用了什么样的规范和方法.
- 使用设计模式并不作用于你的代码中,而是印在你的大脑中. 一旦你设计新的系统时想到了那么多的设计模式,你就能在新的设计中采用他们.当你面对一个旧工程,复杂纷乱的代码时,你可以用大脑中的设计模式重做这些代码.
- 设计模式比库的等级更高.实际上库仅仅给我们提供了一些具体的实现. 大部分的库也是围绕设计模式构造的.
- 知道OO基础概念,是不能设计出弹性的,可复用的,可维护的系统的.但是这些设计经验被收集整理成就了设计模式.
- 建立可维护的OO系统,要诀就在于随时想到系统以后可能需要变化以及应付变化的原则.
11. 章末总结
第一章知识点总结.png@ 2017年12月3日22:39:20
网友评论