重构第七章
5.Hide Delegate(隐藏委托)
客户端直接调用server object(服务对象)的delegate class。在server端建立客户端所需的所有函数,用以隐藏委托关系
Example:
class Person {
Department _department;
public Department getDepartment() {
return _department;
}
public void setDepartment(Department arg) {
_department = arg;
}
};
class Department {
private string _chargeCode;
private Person _maneger;
public Department(Person manager) {
_manager = manager;
}
public Person getManager() {
return _manager;
}
};
Analyse:
上面的示例代码,表示的应该是server object(服务对象)的实现。
用户即客户端希望得到一个Person的Manage。
manager= john.getDepartment().getManager();
用户能通过以上代码,知道Department用来追踪manager的信息。
在Person中建立一个简单的委托函数:
public Person getManager() {
return _department.getManager();
}
客户端调用修改为:
manager = john.getManager();
End:
class Person {
Department _department;
public void setDepartment(Department arg) {
_department = arg;
}
public Person getManager() {
return _department.getManager();
}
};
class Department {
private string _chargeCode;
private Person _maneger;
public Department(Person manager) {
_manager = manager;
}
public Person getManager() {
return _manager;
}
};
Conclusion:
在示例中,如果Person和Department类之间的委托关系发生变化,客户也需要进行相应的变化。
在重构之后,如果Person和Department类之间的委托关系发生变化,客户不需要变化,变化限定在server object中。
同时,可能调用getDepartment的地方有很多处,如果server object 不再提供这个接口,或者这个接口由于一点原因,不在兼容的情况下,可能修改的位置会有很多的地方。
而同一封装在Person中,客户不需要对其代码进行任何的修改,具体的修改内容局限在了server object内,扩展更加的方便。
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!