1.设计模式简介+2.面向对象设计原则
设计模式简介
什么是设计模式——“每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。
历史性著作:《设计模式:可复用面向对象软件地基础》
一、从面向对象谈起
两大思维
底层思维:向下,如何把握机器底层从围观理解对象构造
- 语言构造
- 编译转换
- 内存模型
- 运行时机制
抽象思维:向上:如何将我们的周围世界抽象为程序代码
- 面向对象
- 组件封装
- 设计模式
- 架构模式
二、深入理解面向对象
向下:深入理解三大面向对象机制
- 封装,隐藏内部实现
- 继承,复用现有代码
- 多态,改写对象行为
向上:深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,掌握什么是“好的面向对象设计”
三、重新认识面向对象
- 理解隔离变化
从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小
- 各司其职
从微观层面来看:面向对象的方式更强调各个类的“责任”
由于需求变化导致的新增类型不应该影响原来类型的实现——是所谓各负其责
- 对象是什么
从语言实现层面来看,对象封装了代码和数据
从规格层面来讲,对象是一系列可被使用的公共接口
从概念层面将,对象是某种拥有责任的抽象
四、面向对象设计原则
-
依赖倒置原则
高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)
抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)
-
开放封闭原则
对扩展开放,对更改封闭
类模块应该是可扩展的,但是不可修改
-
单一职责原则
一个类应该仅有一个引起它变化的原因
变化的方向隐含着类的责任
-
Liskov替换原则
子类必须能够替换它们的基类
继承表达类型抽象
-
接口隔离原则
不应该强迫客户程序依赖它们不用的方法
接口应该小而完备
-
优先使用对象组合,而不是类继承
类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
继承在某种程度上破坏了封闭性,子类父类耦合度高
而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低
-
封装变化点
使用封装来创建对象之间的分界层,让设计者可以在分界层一侧进行i修改,而不会对另一侧产生不良影响,从而实现层次间的松耦合
-
针对接口编程,而不是针对实现编程
不将变量类型声明为某个特定的具体类,而是声明为某个接口
客户程序无需获知对象的具体类型,只需要知道对象所具有的接口
减少系统中各部分的依赖关系,从而实现“高内聚、低耦合”的类型设计方法
设计模式分类
-
从目的来看:
创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体实现引来的冲击。
结构型(Structural)模式:通过类继承或者对象组合获得灵活的结构,从而应对需求变化为对象的结构带来的冲击。
行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。
-
从范围来看:
类模型处理类与子类的静态关系
对象模型处理对象间的动态关系
-
从封装变化角度对模式分类
组件协作 | 单一职责 | 对象创建 | 对象性能 | 接口隔离 | 状态变化 | 数据结构 | 行为变化 | 领域问题 |
---|---|---|---|---|---|---|---|---|
Template Method | Decorator | Factory Method | Singleton | Facade | Memento | Composite | Command | Interpreter |
Strategy | Bridge | Abstract Factory | Flyweight | Proxy | State | Iterator | Visitor | |
Observer/Event | Prototype | Mediator | Chain of Responsibility | |||||
Builder | Adapter |