目录
- MoveMethod(搬移函数)
- MoveField(搬移字段)
- InlineClass(将类内联化)
- HideDelegate(隐藏“委托关系”)
- RemoveMiddleMan(移除中间人)
- IntroduceForeignMethod(引入外加函数)
- IntroduceLocalExtension(引入本地扩展)
在对象之间搬移特性
搬移函数
做法:
- 检查原类中被原函数所使用的一切特性,包括字段和函数,考虑它们是否也被搬移
- 检查原类的子类和超类,看看是否有该函数的其它声明
搬移字段
做法:
- 如果字段的访问级别是public,将其封装起来。
- 在目标类中建立与原字段相同的字段,并同时建立相应的设值/取值函数。
- 决定如何在原对象中引用目标对象。
- 删除原字段。
- 将所有对原字段的引用替换为对某个目标函数的调用。
将类内联化
- 某个类并没有做太多的事情,将这个类的所有特性搬移到另一个类中,然后移除原类。
隐藏“委托关系”
- 客户通过一个委托类在调用另一个对象。在服务类上建立客户所需的所有函数,用以隐藏委托关系。
- 如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,客户也得相应变化。你可以在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。
移除中间人
- 某个类做了过多的简单委托动作,让客户直接调用受托类。
- 在“隐藏委托关系”中,谈到了“封装受托对象的好处”。但是这层封装是需要付出代价的:每当客户要使用受托类的新特性时,你就必须在服务器端添加一个简单委托函数。
- 移除中间人手法和“隐藏委托关系”正好相反,正是由于相反,才能够在实际的应用中进行灵活的变通。可能一些委托关系需要保留,而另一些却需要移除,让客户直接使用受托对象。这些都是可以随之变通的。对于各种不同重构手法的使用,同样没有绝对的规定,都是需要依据实际灵活使用的。
引入外加函数(外加函数是权宜之计, 多的话就引入本地扩展)
- 你需要为提供服务的类增加一个函数,但你无法修改这个类;在客户端建立一个函数,并以第一参数形式传入一个服务类实例
引入本地扩展
- 你需要为服务类提供一些额外函数,但你无法修改这个类
- 拓展hashmap源码之类的。
- 可参考重构笔记——引入本地扩展
网友评论