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

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

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

动机:

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

任何学过对象技术的人都知道:虽然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()了。

时间: 2024-08-02 17:10:59

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

重构摘要7_在对象之间搬移特性

<重构-改善既有代码的设计>Martin Fowler 摘要: 第七章 在对象之间搬移特性 Move Method 搬移函数 你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用 在该函数最常引用的类中建立一个有着类似行为的新函数.将旧函数变成一个单纯的委托函数,或者将旧函数完全移除. Move Field 搬移字段 某个字段被其所驻类之外的另一个类更多地用到. 如果我需要对类做许多处理,保持小步前进是有帮助的. Extract Class 提炼类 某个类做了应该由

【重构.改善既有代码的设计】7、在对象之间搬移特性(如何优化类)

7.在对象之间搬移特性 Move Method(搬移函数) 描述:有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或被后者调用.在该函数最常引用(指涉)的class中建立一个有着类似行为的新函数.将旧函数变成一个单纯的委托函数(delegating method),或是将旧函数完全移除. 原因:高耦合.依赖情节. 注意:1.在迁移的时候,要考虑函数用到的属于原class的变量及其他函数,是否也应该迁移,这会是更大的收获.2.不是所有变量都需要移动的,不能移动的作为调用参数

重构手法之在对象之间搬移特性【4】

返回总目录 本小节目录 Introduce Foreign Method(引入外加函数) Introduce Local Extension(引入本地扩展) 7Introduce Foreign Method(引入外加函数) 概要 你需要为提供服务的类增加一个函数,但你无法修改这个类. 在客户类中建立一个函数,并以第一参数形式传入一个服务类实例. 动机 好吧,我得不得说这个在C#中称为:扩展函数.这个其实也没什么好说的,这种事情发生过太多次了.假说你正在使用string类,它基本上提供了我们所需

学习重构(3)-在对象之间搬移特性

1. Move Method(搬移函数) 在该函数最常用的勒种简历一个有着类似行为的新函数,将就函数变成一个单纯的委托函数,或是将就函数完全移除. 应用场景:搬移函数是重构理论的支柱,如果一个类有太多行为,或者一个类与另一个类有太多合作而形成高度耦合,我们就需要搬移函数.通过这种手段,我们可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的任务. 示例: class A... void a1()... void a2() { B b = new B(); b.b1(); b.b2()

第3章 在对象之间搬移特性(2):提炼类、类的内联化

3. 提炼类(Extract Class) 3.1 动机 (1)某个类做了应该由两个类做的事,可以将相关字段和函数从旧类搬移到新类. (2)当某些特性需要以一种方式来子类化,另外一些特性则需要以另一种方式子类化,这就意味着需要分解原来的类. 3.2 做法 (1)决定如何分解类所负的责任. (2)建立一个新类,用以表现从旧类中分离出来的责任.如果旧剩下的责任与旧类名称不符,也可以为旧类更名. (3)建立“从旧类访问新类”的连接关系.有时可能需要一个双向连接,但是在真正需要它之前,不要建新“从新类通

《重构:改善既有代码的设计》(四) 第7章 在对象之间搬移特性

重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)

客户通过一个委托类来调用另一个对象.在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机:封装即使不是对象的最关机特性,也是最关机特性之一.“封装”意味着每个对象都应该少了解系统的其他部分.如此以来,一旦发生变化,需要了解这一变化的就比较少---这会使系统比较容易进行. 任何学过对象技术的人都知道:虽然Java将字段声明为public,但你还是应该隐藏对象的字段.随着经验日渐丰富,你会发现,有更多可以(值得)封装的东西.如果某个客户需要通过服务对象的字段得到另一个对象,然后调用后者的函数,

重构笔记——搬移函数

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42679983         我们都知道,类往往因为承担过多的责任而变得臃肿不堪.这种情况下,一般会使用"提炼类"这种手法将一部分责任分离出去.如果一个类变得"不负责任",一般会使用"内联类"这种手法将它融入另一个类.如果一个类使用了另一个类,一般会运用"隐藏委托关系"手法将这种关系隐藏

『重构--改善既有代码的设计』读书笔记----Hide Delegate

所谓委托关系,就是一个类对于另一个类来说纯粹作为接口转发,即客户通过一个委托类去调用另一个对象.直白的委托关系就是委托类直接返回出目标类给客户调用,这个关系很麻烦,因为委托关系的变动就会影响客户端的代码.隐秘的委托关系很健康,当你完全隐藏之后,你委托关系的变化只会发生在委托类的内部,从而不会去影响客户. 封装是面向对象最关键的特征之一.他意味着系统的每个对象都应该尽可能少的了解系统的其他部分,这样带来的好处就是一旦发生了变化之后,需要了解到这一变化的对象就比较少,这也就意味着你需要改动的代码可以