向客户端影藏服务端的代理关系,减少客户端和服务端的耦合关系,服务端内部调整结构时不会影响客户端使用。
举个例子
A类作为调用方他承扮演客户端角色;B和C类组合提供服务扮演服务端角色;
没有影藏委托关系,调用流程:当A类需要获取服务时,它首先获取B类对象,B类委托给C类实现该功能,于是通过B类对象获取C类对象提供的服务。如果B或C做出调整,那么A类也要跟着调整才能继续获取服务。
影藏委托关系,调用流程:在B类中获取将C类服务影藏委托关系,此时A类调用B类就可以获取服务。如果C类做出调整,那么只有B类调整即可,不会影响到C类。
本例从两个classes开始,代表「人」的Person和代表「部门」的Department:
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;}...
如果客户希望知道某人的经理是谁,他必须先取得Department对象
// john是Person的对象,查询john的经理manager = john.getDepartment().getManager();
这样的编码就是对客户揭露了Department的工作原理,于是客户知道:Department用以追踪「经理」这条信息。如果对客户隐藏Department,可以减少耦合(coupling)。 为了这一目的,我在Person中建立一个简单的委托函数:
public Person getManager() {return _department.getManager();}
现在,我得修改Person的所有客户,让它们改用新函数:
manager = john.getManager();
只要完成了对Department所有函数的委托关系,并相应修改了Person的所有客 户,我就可以移除Person中的访问函数getDepartment()了。