Closed cuixiaorui closed 4 years ago
局部化影响
最小化重复
将逻辑与数据绑定
对称性
举例
add <--> remove
概念上的对称
声明式表达
变化率
类似单一职责
把需要一起变化的功能放到一起
简单的超类名
限定性的子类名
子类的名字应该表达出它与超类之间的相似性和差异性
描述类像什么
说明和其他子类之间的关系
通常可以在超类的基础上扩展一两个词即可
特殊:本身代表了重要的概念
需要像对待超类一样
抽象接口
将接口与实现分离
针对接口编程,不要针对实现编程
接口:一组没有实现的操作
当真正需要这种灵活性的时候在引入接口
接口是有成本的
interface
用 java 的 interface 机制来表现不常变化的抽象接口
命名
和类一样命名
添加 I 前缀
这是我要完成的任务,除此之外的细节不归我操心
改动会影响所有之前的设计
核心定义
like a
抽象类
用抽象类来表现很可能变化的抽象接口
超类的引用可以在运行时替换为任何子类的对象
和 interface 的区别
interface 改动的话会影响所有设计
抽象类的话 只需要提供基础的实现,那么不会影响到全局
interface 和抽象类不互斥
提供一个接口:可以使用这些功能
提供一个超类:这是一种实现方式
is a
有版本的 interface
值对象
这种对象的行为就好像数值一样
值不可变的对象
使用
区分出”状态的世界“和”值得世界“
组合使用状态可变的对象和值对象
改变值得时候总是返回一个全新的对象,使用者负责存储
特化
清晰地描述计算过程中相似性与差异性的相互作用,可以让程序更容易阅读、使用和修改
差异性
相同的逻辑处理不同的数据
不同的逻辑处理相同的数据
子类
用一个子类表现一个维度上的变化
共享实现
继承
声明一个子类
这些对象与那些对象很类似,只除了……
局限性
共享实现只能用一次
使用者必须首先理解超类
对超类的修改颇有风险
超类中的逻辑必须进行彻底地划分到每个方法只做一件事
方法足够的小,那么子类就容易重写
有点模板模式的意思
实现器
覆盖一个方法,从而表现一种计算上的变化
多态之美
给系统开启了变化的机会
内部类
实例特有的行为
条件语句
明确指定条件,以表现不同的逻辑
实现实例特有的行为
方式
好处
所有的逻辑仍然在同一个类里,阅读者不必四处寻找所有可能的计算路径
简单
局部化
缺点
除了修改对象本身的代码之外,没有其他办法修改它的逻辑
不灵活
解决
条件逻辑变成消息
发送给子类或者委派
委派
把操作委派给不同类型的对象,以表现不同的逻辑
不变的逻辑放在发起委派的类中,变化的逻辑交给被委派的对象
多态的使用方式
委派对象可以保存在实例变量里
可插拔对象
实现代码共享
可插拔的选择器
通过反射来调用方法,以表现不同的逻辑
反射 java.class 对象
匿名内部类
库类
如果一组功能不适合放进任何对象,就将其描述为一组静态方法
某些功能放在哪个对象中都不合适,那么就放到库类里(类似 utils)
保存为静态方法
少用
尽可能的使用类
状态
使用可变的值进行计算
管理状态
把相似的状态放一起,不同的状态要分离
相同相似性
访问
直接访问
直接访问对象的内部状态
只在访问器和构造器中使用
只在类中使用
以上两种规则并不是绝对的
优点
清晰
灵活性低
属于实现细节,层面低于编程时通常的思考层面
间接访问
通过方法来访问状态,从而提高灵活性
允许在类中直接访问,其他的使用者必须间接访问
通用状态
把状态保存在一个字段中,使得该类的所有对象都拥有这些状态
新建一个类来保存这些通用状态
可变状态
外生状态
变量
局部变量
具备变量保存的状态只在单一作用域有效
信息最小扩散原则
哪里使用就声明在哪里
角色
收集器
计数
解释
复用
元素
字段
字段保存的状态在对象的整个生命周期有效
助手
标记
boolean 型的标记
如果是 true 就这样
如果是 false 就那样
策略
组件
参数
收集参数
参数对象
常量
按角色命名
声明时的类型
初始化
及早初始化
延迟初始化
并行架构
增加一个过渡式的发布
减少可见的细节数量,只暴露那些变化可能性较小的细节
交付可用的功能,又保留更改设计的自由
兼容性
向后兼容
客户端仍然可以调用旧的api
向前兼容
可以向客户端中传入新形式的对象,而他们还可以像旧对象一样工作
程序类库
库类是一种简单的api形式,经得起未来的考验
提供一系列的静态方法
问题
客户代码只能改变他们自己发送给框架的数据,缺无法更改逻辑
能够被轻松表达出来的概念数目是有限的
对象
使用方式
实例化
配置
实现
抽象
接口
超类
创建方式
无对象创建
构造器
工厂方法
工厂对象
方法
框架是在一个领域内所有有价值的功能的交集,而不是并集
多值变量
容器就是对象
数学集合
概念
选择容器
array
iterable
collection
list
set
sortedSet
map
XMind: ZEN - Trial Version
实现模式
价值观
核心
定义
原则
定义
核心
局部化影响
最小化重复
将逻辑与数据绑定
对称性
举例
add <--> remove
概念上的对称
声明式表达
变化率
类似单一职责
把需要一起变化的功能放到一起
类
定义
把数据和逻辑关联起来
模式
简单的超类名
限定性的子类名
子类的名字应该表达出它与超类之间的相似性和差异性
描述类像什么
说明和其他子类之间的关系
通常可以在超类的基础上扩展一两个词即可
特殊:本身代表了重要的概念
需要像对待超类一样
抽象接口
将接口与实现分离
针对接口编程,不要针对实现编程
接口:一组没有实现的操作
当真正需要这种灵活性的时候在引入接口
接口是有成本的
interface
用 java 的 interface 机制来表现不常变化的抽象接口
命名
和类一样命名
添加 I 前缀
这是我要完成的任务,除此之外的细节不归我操心
改动会影响所有之前的设计
核心定义
like a
抽象类
用抽象类来表现很可能变化的抽象接口
超类的引用可以在运行时替换为任何子类的对象
和 interface 的区别
interface 改动的话会影响所有设计
抽象类的话 只需要提供基础的实现,那么不会影响到全局
interface 和抽象类不互斥
提供一个接口:可以使用这些功能
提供一个超类:这是一种实现方式
核心定义
is a
有版本的 interface
值对象
这种对象的行为就好像数值一样
值不可变的对象
使用
区分出”状态的世界“和”值得世界“
组合使用状态可变的对象和值对象
改变值得时候总是返回一个全新的对象,使用者负责存储
特化
清晰地描述计算过程中相似性与差异性的相互作用,可以让程序更容易阅读、使用和修改
差异性
相同的逻辑处理不同的数据
不同的逻辑处理相同的数据
子类
用一个子类表现一个维度上的变化
共享实现
继承
声明一个子类
这些对象与那些对象很类似,只除了……
局限性
共享实现只能用一次
使用者必须首先理解超类
对超类的修改颇有风险
使用
超类中的逻辑必须进行彻底地划分到每个方法只做一件事
方法足够的小,那么子类就容易重写
有点模板模式的意思
实现器
覆盖一个方法,从而表现一种计算上的变化
多态之美
给系统开启了变化的机会
内部类
实例特有的行为
条件语句
明确指定条件,以表现不同的逻辑
实现实例特有的行为
方式
好处
所有的逻辑仍然在同一个类里,阅读者不必四处寻找所有可能的计算路径
简单
局部化
缺点
除了修改对象本身的代码之外,没有其他办法修改它的逻辑
不灵活
解决
条件逻辑变成消息
发送给子类或者委派
委派
把操作委派给不同类型的对象,以表现不同的逻辑
不变的逻辑放在发起委派的类中,变化的逻辑交给被委派的对象
多态的使用方式
委派对象可以保存在实例变量里
可插拔对象
实现代码共享
可插拔的选择器
通过反射来调用方法,以表现不同的逻辑
反射 java.class 对象
匿名内部类
库类
如果一组功能不适合放进任何对象,就将其描述为一组静态方法
某些功能放在哪个对象中都不合适,那么就放到库类里(类似 utils)
保存为静态方法
少用
尽可能的使用类
状态
对象包装了行为和状态
模式
状态
使用可变的值进行计算
管理状态
把相似的状态放一起,不同的状态要分离
相同相似性
访问
直接访问
直接访问对象的内部状态
使用
只在访问器和构造器中使用
只在类中使用
以上两种规则并不是绝对的
优点
清晰
缺点
灵活性低
属于实现细节,层面低于编程时通常的思考层面
间接访问
通过方法来访问状态,从而提高灵活性
使用
允许在类中直接访问,其他的使用者必须间接访问
通用状态
把状态保存在一个字段中,使得该类的所有对象都拥有这些状态
新建一个类来保存这些通用状态
可变状态
外生状态
变量
局部变量
具备变量保存的状态只在单一作用域有效
信息最小扩散原则
哪里使用就声明在哪里
角色
收集器
计数
解释
复用
元素
字段
字段保存的状态在对象的整个生命周期有效
角色
助手
标记
boolean 型的标记
如果是 true 就这样
如果是 false 就那样
策略
状态
组件
参数
收集参数
参数对象
常量
按角色命名
声明时的类型
初始化
及早初始化
延迟初始化
行为
控制流
主体流
消息
选择性消息
双重分发
分解性消息
反置性消息
邀请性消息
解释性消息
异常流
卫述句
异常
已检查异常
异常传播
改进框架
修改框架而不修改应用
不兼容的更新(增量式更新)
并行架构
增加一个过渡式的发布
鼓励可兼容的变化
减少可见的细节数量,只暴露那些变化可能性较小的细节
交付可用的功能,又保留更改设计的自由
兼容性
向后兼容
客户端仍然可以调用旧的api
向前兼容
可以向客户端中传入新形式的对象,而他们还可以像旧对象一样工作
程序类库
库类是一种简单的api形式,经得起未来的考验
提供一系列的静态方法
问题
客户代码只能改变他们自己发送给框架的数据,缺无法更改逻辑
能够被轻松表达出来的概念数目是有限的
对象
使用方式
实例化
配置
实现
抽象
接口
超类
创建方式
无对象创建
构造器
工厂方法
工厂对象
方法
隐喻
框架是在一个领域内所有有价值的功能的交集,而不是并集
容器
隐喻
多值变量
容器就是对象
数学集合
要点
概念
选择容器
接口
array
iterable
collection
list
set
sortedSet
map
方法
组合方法
揭示意图的名称
方法可见性
方法对象
覆盖方法
重载方法
方法返回类型
方法注释
助手方法
调试输出方法
转换
转换方法
转换构造器
创建
完整的构造器
工厂方法
内部工厂
容器访问器方法
布尔值 setting 方法
查询方法
相等性判断方法
getting 方法
setting 方法
安全副本
XMind: ZEN - Trial Version