在对象之间搬移特性---Hide Delegate(隐藏委托关系)

本文探讨了如何通过在服务类上创建客户所需的函数,隐藏对象之间的委托关系,以降低系统耦合度。当客户直接访问委托对象时,如果委托关系变化,会导致客户代码也需要改动。通过在Person类中添加一个委托函数getManager(),可以隐藏Department对象,减少客户对内部结构的了解。随着所有依赖的更新,原本的getDepartment()函数可以逐步移除,实现更佳的封装和系统稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

客户通过一个委托类来调用另一个对象。

在服务类上建立客户所需的所有函数,用以隐藏委托关系。


动机:

封装即使不是对象的最关机特性,也是最关机特性之一。“封装”意味着每个对象都应该少了解系统的其他部分。如此以来,一旦发生变化,需要了解这一变化的就比较少---这会使系统比较容易进行。


任何学过对象技术的人都知道:虽然Java将字段声明为public,但你还是应该隐藏对象的字段。随着经验日渐丰富,你会发现,有更多可以(值得)封装的东西。

如果某个客户需要通过服务对象的字段得到另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生变化,那么客户也得相应变化。你可以在服务对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这么以来即使将来发生魏国关系上的变化,变化也将被限制在服务对象中,不会波及客户。


范例:

本例从两个类开始:代表“人”的Person类和代表“部门”的Department类。

class Person{

Department _department;

public Department getDepartment(){

reutrn _department;

}

public void setDepartment(Department department){

_department=department;

}

}


class Department{

private  String _chargeCode;

private Person _manager;

public Department(Person manager){

_manager=manager;

}

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()了。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值