共计 1688 个字符,预计需要花费 5 分钟才能阅读完成。
-
当波及到“保护”时,为了“复用”目标而应用继承,终局并不完满
P4
- 对父类代码进行批改时,影响层面可能会很大
思考题
利用继承来提供 Duck
的行为,这会导致下列哪些毛病?(多选)P5
-
[] A. 代码在多个子类中反复
- 应用继承就是为了复用代码
- 【答案有此选项】从另一方面思考,也有这个毛病,比方:多个子类都存在雷同的实现,但又与父类的实现不同
-
[x] B. 运行时的行为不容易扭转
- 编译实现后,各种行为曾经确定,无奈再持续批改(第一次看没有抉择,看完策略模式后又感觉有这个毛病)
-
[] C. 咱们不能让鸭子跳舞
- 在父类中写 dance() 的办法即可
-
[x] D. 很难晓得所有鸭子的全副行为
- 子类能够笼罩父类的办法,所以不晓得子类的具体行为
-
[] E. 鸭子不能同时又飞又叫
- 在父类中写 flyAndQuack() 即可
-
[x] F. 扭转会牵一发而动全身,造成其余鸭子不想要的扭转
- 在父类 Duck 中减少 fly() 办法,就会使得所有的子类鸭子都会飞,包含不会飞的橡皮鸭
应用接口方式的优缺点 P6
长处
- 能够防止继承时的呈现有不应具备的的行为而大量笼罩
- 在 Java8 中能够用默认办法实现和继承成果一样的代码复用
毛病
- 某一行为在子类中都具备,却有不同实现时,依然有代码反复的问题
- 在获取到父类时,必须得先用 instanceof 判断是否实现某接口,能力转换类型应用相干办法
思考题
驱动扭转的因素很多。找出你的利用中须要扭转代码的起因,一一列进去 P8
- 咱们的顾客或用户须要别的货色,或者想要新性能
- 我的公司决定采纳别的数据产品,又从另一家厂商买了数据,这造成数据格式不兼容
- 重构
- 性能优化
- 修复 BUG、平安问题
设计准则
取出并封装变动的局部,让其余局部不会受到影响 P9
- 缩小扭转代码带来的影响
- 便于批改和裁减,更具备弹性
设计准则
针对接口编程,而不是针对实现编程 P11
- 能够在运行时动静扭转实现
“针对接口编程”即“针对超类型 (supertype) 编程”P12
- 接口既指一种“概念”,也指 Java 的
interface
设计准则
多用组合,少用继承 P23
- 组合具备弹性,能够动静扭转实现
策略模式
定义了算法族,别离封装起来,让它们之间能够相互替换,此模式让算法的变动独立于应用算法的客户 P24
其实没学的时候也常常凭借教训人不知; 鬼不觉中应用到了策略模式,比方:不同字段的校验逻辑、不同举荐策略、不同车型匹配逻辑等等。- 策略模式在 Java 源码中能够说随处可见,比方 ThreadPoolExecutor 中的 RejectedExecutionHandler 就是策略,用来进行回绝新工作。能够在初始化线程池的时候能够设置相应的四种回绝策略中的一种以满足不同的须要
private volatile RejectedExecutionHandler handler;
// RejectedExecutionHandler 接口定义
public interface RejectedExecutionHandler {void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
- 刚开始看到策略模式和观察者模式的时候,感觉两者差不多(或者说是观察者模式自带策略模式)。起初有认真思考了一下,两者的区别次要还是在应用场景上。策略模式次要是调用策略的一方想通过这个策略实现本人所须要的性能,个别每次只有一种策略;观察者模式次要是主题想告诉观察者使观察者实现本人的性能,能够存在多个不同的观察者
良好的 OO 设计具备的个性 P32
- 可复用
- 可裁减
- 可保护
所思所想
- 教训和实战的作用还是挺大的,始终在耳濡目染地影响代码格调和思考形式
- 系统地学习相干常识,能够使本人思考更全面,从思考架构的档次进步到模式层面
- 平时写代码时也总会想到哪些地方须要变动,并进行肯定的解决;这是个好习惯,要持续保持,但也要保障尽快开始第一步(或者边实现边设计),避免设计很久,却在实现时发现很多中央不实用的状况产生
- 很多时候从不同方面思考问题时,失去的答案并不一样,要有辩证思维
本文首发于公众号:满赋诸机(点击查看原文)开源在 GitHub:reading-notes/head-first-design-patterns
正文完