1.什么是经验?

经历了一个问题,摸索出解决方法,验证后正确,总结后得到经验
好处
可靠,且省时、省力
本质
键值对【问题,解决思路】
模式
可重复使用的套路

2.什么是面向对象设计?

面向对象
把职责封装到每个类中,让它们分工协作,最终完成需求
设计
思考出各种可能的分工协作方式,分析优劣后、选择最合适的

3.面向对象设计模式

背景
任何问题,都在特定背景下产生
需求
要达成的目标
解决思路
uml / 文字说明
效果
分析得失
命名
方便记忆和沟通

1.封装

隐藏内部实现
最少知识原则,仅暴露必要的信息
提升抽象级别
不再关注细节,节省脑力

2.继承

复用
物理上,复用已有的代码
扩展
逻辑上,扩展现有的逻辑(站在巨人的肩膀上)

3.多态

复用
物理上,多种实现复用一个接口
抽象
逻辑上,将现有逻辑抽象为一个接口

4.对象组合

与继承相似
都是复用和扩展
与继承不同
继承关注类别(姓什么) / 组合关注部件(用什么)

1.单一职责

一个类只有一个职责
说明
是唯一引起类改变的原因,也是它存在的意义

2.开闭

可以增加逻辑,不应修改逻辑
说明
不是说不能修改已有逻辑,而是设计的足够好,不需要(因为需求变更)修改现有逻辑

3.里氏替换

父类的对象,可被子类对象替换 / 接口可被它的实现类替换
说明
抽象 要被 具体实现 来替换

4.依赖倒置

对抽象编程,而不对具体实现编程
说明1
降低程序的耦合性,且分清了主次(抽象就是框架,具体实现成了填充物)
说明2
是一种编程思路,从大处着眼(定义抽象),从小处着手(具体实现)

5.接口隔离

保持职责单一,包含较少的方法
说明1
包含的方法过多,会迫使具体类实现无用的方法
说明2
职责清晰,才好分配;职责含糊,分工就混乱

1.目标

可维护性
代码结构逻辑清晰、方便管理
可扩展性
不修改已有逻辑,容易扩展新的逻辑

2.手段

抽象变化点
利用继承机制,将多种可能情况抽象成父类或接口
封装变化点
增加中间层,解耦依赖关系(A -> 中间层 -> B),同时将变化封装到了中间层
控制权转出
把所依赖对象,暴露成外部参数,由外部负责如何创建(与'延迟创建'相反)
延迟创建
把所依赖对象,吸纳为内部成员,使用前决定如何创建(与'控制权转出'相反)
想象力
无论采取何种手段,从宏观层面看:都是构思出各种角色,通过合理组织,使它们仅通过各司其职,就能协作完成软件的整体目标(这就像是中医和西医的不同思维方式)

3.发展

学习
现有设计模式是前人总结的成果,应好好学习和利用
进步
设计模式的本质是:根据面向对象设计原则,合理封装变化点。按照这个原则,未来可以创造更多的模式

4.分类

创建型模式
解决 对象的创建
结构型模式
解决 类的结构设计
行为型模式
解决 对象协作时的职责分配

1.软件开发的特点和致命弱点就是需求变化,导致程序不断的修改,牵一发而动全身,不仅工作量大且容易造成出错返工;设计模式恰好针对这个问题,在需求获取和软件设计时,提前考虑需求和设计的变化点,对可能性大的变化点应用设计模式,这样就应对了变化
2.软件管理的是逻辑,除了应对变化,设计模式的另一个作用是 良好的组织逻辑
3.类比:这种解决问题的套路,有点像打拳(以养生为目的,可以打个太极拳套路;以搏击为目的,可以打个泰拳的套路;以表演为目的,可以打个艺术体操的套路)