本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929
在上一篇文章中介绍了“将类内联化”。本文将介绍“隐藏委托关系”这种重构手法。
下面让我们来学习这种重构手法吧。
发现:客户通过一个委托关系来调用另一个对象。
解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系。
我们都知道,”封装“即使不是对象的最为关键的特征,也是最为关键的特征之一。 ”封装“意味着每个对象都应该尽可能少了解系统的其它部分。这样,一旦发生变化,需要了解这一变化的对象就会比较少——这会使变化比较容易。
如果某个客户先通过服务对象的字段得到了另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生了变化,那么客户也得相应改变。那么,我们可以再服务器对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这样,即使在将来委托关系发生变化,也只在服务器对象中,而不会涉及客户。
class Person{ Department _department; public Department get_department() { return _department; } public void set_department(Department _department) { this._department = _department; } }
class Department{ private String _changeCode; private Person _manager; public Person get_manager() { return _manager; } public void set_manager(Person _manager) { this._manager = _manager; } //...... }如果客户想要知道某人的经理是谁,他必须先取得Department对象:
Person john = new Person(); Person manager = john.get_department().get_manager();这样的编码对客户暴露了Department的工作原理,于是客户知道;Department用以追踪“经理”这条信息。如果对客户隐藏Department,可以减少耦合。为了到达预期的目的,在Person中建立一个简单的委托函数:
public Person getManager(){ return _department.get_manager(); }现在,需要修改Person的所有用户,让它们使用新的函数:
Person manager = john.getManager();只要完成了对Department所有函数的委托关系,并相应修改了Person的所有客户,就可以移除Person中的访问函数get_department()了。
原文地址:http://blog.csdn.net/pistolove/article/details/43769929