客户通过一个委托类来调用另一个对象。
在服务类上建立客户所需的所有函数,用以隐藏委托关系。
动机:
封装意味每个对象都应该尽可能少了解系统的其他部分。如此一来,一旦发生变化,需要了解这一变化的对象就会比较少。
如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,客户也得相应变化。可以在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。
做法:
对于每一个委托关系中的函数,在服务对象端建立一个简单的委托函数。
调整客户,令它只调用服务对象提供的函数。
=》如果使用者和服务者不在同一个包,考虑修改委托函数的访问权限,让客户得以在包之外调用它。
旧代码
class Person{
Department _department;
public Department getDepartment(){
return _department;
}
public void setDepartment(Department arg){
_department = arg;
}
}
class Department{
private String _chargeCode;
private Person _manager;
public Department(Person manager){
_manager = manager;
}
public Person getManager(){
return _manager;
}
}
新代码
public Person getManager(){
return _department.getManager();
}