Hide Delegate (隐藏“委托关系")

Summary: 

客户经过一个委托来调用另外一个对象。在服务类上创建客户所需的全部函数,用以隐藏委托关系。 java

Motivation:

“封装”即便不是对象的最关键特征,也是最关键特征之一。“封装”意味着每一个对象都应该尽量少了解系统的其余部分。如此一来,一旦发生变化,须要了解这一变化的对象就会比较少—这会使变化比较容易进行。 函数

若是某个客户先经过服务对象的字段获得另外一个对象,而后调用后者的函数,那么客户就必须知晓这一层委托函数。万一委托关系发生变化,客户也得相应变化。咱们能够在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这么一来,即使未来发生委托关系上的变化,变化也被限制在服务对象中,不会波及客户。 测试

对于某些或所有客户,可能有必要先使用Extract Class。一旦对全部客户都隐藏了委托关系,就再也不须要在服务对象的接口中公开被委托对象了。 编码

Mechanics:

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()了
相关文章
相关标签/搜索