决定把责任放在哪儿,通常使用Move Method和Move Field简单地移动对象行为。
常用方法:Extract class ,Inline Class , Hide Delegate, Remove Middle Man,Introduce Foreign Method, Introduce Local Extension
Move Method (搬移函数)
-
有个一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合。
-
有个函数与其所驻类之外的另一个类进行更多交流,调用后者,或者被后者调用,-> 在该函数中创建一个类似行为的方法,将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。
-
当需要 使用源类的特性时,有四种选择
- 将这个特性也移到目标类
- 建立或使用一个从目标类到源类的引用关系
- 将源对象当做参数传给目标函数
- 如果所需特性是个变量,将它作为参数传给目标函数
Move Field(搬移字段)
- 在你的程序中,某个字段被其所驻类之外的另一个类更多的用到。
- 在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段
- 使用Self-Encapsulation自我封装,在get/set函数中调用目标类字段。
Extract Class(提炼类)
- 建立一个新类,将相关的字段和函数从旧类搬移到新类。
Inline Class(将类内联化)
- 将这个类的所有特性搬移到另一个类中,然后移除原类
Hide Delegate (隐藏【委托关系】)
-
客户直接调用其server object 的delegate class
Remove Middle Man(移除中间人)
- 某个class做了过多的简单委托动作,让客户直接调用delegate类
- 与Hide Delegate相反,当委托过多时,就要考虑移除部分或者全部委托关系
Introduce Foreign Method(引入外加函数)
- 你所使用的server class需要一个额外函数,但你无法修改这个class
- 在client class中简历一个函数,用来提供你需要的功能。
- 这个函数不应该取用client class的任何特性,如果他需要一个值,把该值当做参数传给他
- 以server class实体作为该函数的第一个参数。
Introduce Local Extension(引入本地拓展)
- 你说使用的server class需要一些额外函数,但你无法修改这个class
- 建立一个新class,使他包含这些额外函数,让这个拓展品称为source class的subclass或wrapper
- 外加函数超过两个时使用