设计模式学习笔记

设计模式:
把不变的抽象出来,把变化的放到实现

管理软件的复杂度
软件设计复杂的根本原因:变化,变化是复用的天敌
软件设计的目标:复用
面向对象设计的最大的优势:抵御变化
关键词:抽象

设计原则:
1. 依赖倒置原则(DIP)
高层模块(稳定)不应该依赖于底层模块(变化),二者都应该依赖于抽象(稳定)。
抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。
2. 开放封闭原则(OCP)
对扩展开放,对修改封闭。
类模块应该是可扩展的,但是不可修改。
3. 单一职责原则(SRP)
一个类应该仅有一个引起它变化的原因。
变化的方向隐含着类的责任。
4. Liskov替换原则(LSP)
子类必须能够替换它们的基类(IS-A)
继承表达类型抽象。
5. 接口隔离原则(ISP)
不因该强迫客户程序依赖他们不应的方法。
接口应该小而完备。
6. 优先使用对象组合,而不是类继承
类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。
类继承在某种程度上破坏了封装性,子类父类耦合度高。
而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。
7. 封装变化点
使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不是对另一侧产生不良的影响,从而实现层次间的松耦合。
8. 针对接口编程,而不是实现编程
不将变量类型声明为某个特定的具体类,而是声明为某个接口。
客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案。

面向接口设计
产业强盛的标志:接口标准化

好的面向对象设计:应对变化,提高复用

设计模式的要点:寻找变化点,然后在变化点应用设计模式,从而更好的应对需求的变化。 “什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更重要。

看问题: 时间轴(考虑未来的变化),不要静态看问题

重构关键技法
静态-》动态
早绑定-》晚绑定
继承-》组合
编译时依赖-》运行时依赖
紧耦合-》松耦合

“组件协作”模式
模板方法
策略
观察者

“单一职责”,模式
装饰器
桥接

"对象创建"模式
工厂方法
抽象工厂
原型
建造者

“对象性能”模式
单例
享元

“接口隔离”模式
门面
代理
适配器
中介者

"状态变化"模式
状态
备忘录

“数据结构”模式
组合
迭代器
职责链

”行为变化“模式
命令
访问器
解析器

”领域规则“模式
解释器

总结:
一个目标:管理变化,提高复用
两种手段:分解 VS. 抽象
八大原则
重构技法
从封装变化角度对模式分类
对象模型:
class A{
IB b;
}
关注变化点和稳定点
什么时候不用模式:
代码可读性差时
需求理解还很浅时
变化没有显现时
不是系统的关键依赖点
项目没有复用价值时
项目将要发布时
经验之谈:
不要为了模式而模式
关注抽象类 & 接口
理清变化点和稳定类
审视依赖关系
要有Framework和Application的区隔思想
良好的设计时演化的结果

设计模式成长之路:
”手中无剑,心中无剑“:见模式而不知
”手中有剑,心中无剑“:可以识别模式,作为应用开发人员使用模式
”手中有剑,心中有剑“:作为框架开发人员为应用设计某些模式
”手中无剑,心中有剑“:忘掉模式,只有原则

posted @ 2021-12-06 10:24  skorzeny  阅读(42)  评论(0编辑  收藏  举报