客户经过一个委托来调用另外一个对象。在服务类上创建客户所需的全部函数,用以隐藏委托关系。 java
“封装”即便不是对象的最关键特征,也是最关键特征之一。“封装”意味着每一个对象都应该尽量少了解系统的其余部分。如此一来,一旦发生变化,须要了解这一变化的对象就会比较少—这会使变化比较容易进行。 函数
若是某个客户先经过服务对象的字段获得另外一个对象,而后调用后者的函数,那么客户就必须知晓这一层委托函数。万一委托关系发生变化,客户也得相应变化。咱们能够在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这么一来,即使未来发生委托关系上的变化,变化也被限制在服务对象中,不会波及客户。 测试
对于某些或所有客户,可能有必要先使用Extract Class。一旦对全部客户都隐藏了委托关系,就再也不须要在服务对象的接口中公开被委托对象了。 编码
1.对于每个委托关系中的函数,在服务对象端创建一个简单的委托函数。 spa
2.调整客户,令它只调用服务对象提供的函数。 code
若是使用者和服务提供者不在同一个包,考虑修改委托函数的访问权限,让客户得以在包以外调用它。 对象
3.每次调整后,编译并测试。 接口
4.若是未来再也不有客户须要取用Delegate(受托类),即可移除服务对象中的相关访问函数。 get
5.编译,测试。 io
从两个类开始:表明“人”的Person和表明“部门”的Department:
public class Person { Department department; public Department getDepartment() { return department; } public void setDepartment( Department arg ) { department = arg; } }
public class Department { private String chargeCode; private Person manager; public Department( Person person ) { manager = person; } public Person getManager() { return manager; } }若是客户但愿直到某人的经理是谁,他必须先取得Department对象:
manager = john.getDepartment().getManager();这样的编码就是对客户揭露了Department的工做原理,因而客户直到Department用以追踪“经理”这条信息。若是对客户隐藏Department,能够减小耦合。为了这一目的,咱们在Person中创建一个简单的委托函数:
public Person getManager() { return department.getManager(); }如今,修改Person的全部客户,让它们改用新函数:
manager = john.getManager();只要完成了对Department全部函数的委托关系,并相应修改了Person的全部客户,就能够移除Person中访问函数getDepartment()了