ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

#

作法(Mechanics)
    • 在client class中建立一个函数,用来提供你需要的功能。
        • ==》这个函数不应该取用client class的任何特性。如果它需要一个值,把该值当作参数传给它。
    • 以server class实体作为该函数的第一个参数。
    • 将该函数注释为:[外加函数(foreign method),应在server class实现。]
        • ==》这么一来,将来如果有机会将外加函数搬移到server class中,你便可以轻松找出这些外加函数。
posted @ 2005-08-31 14:21 ivaneeo 阅读(250) | 评论 (0)编辑 收藏

动机(Motivation)
进行本项重构时,如果你以外加函数实现一项功能,那就是一个明确信号;这个函数原本应该在提供服务的(server) class中加以实现。

如果你发现自己为一个server class建立了大量外加函数,或如果你发现有许多classes都需要同样的外加函数,你就不应该再使用本项重构,而应该使用Introduce Local Extensiong(164)。
posted @ 2005-08-31 14:15 ivaneeo 阅读(164) | 评论 (0)编辑 收藏

你所使用的server class需要一个额外函数,但你无法修改这个class。

在client class中建立一个函数,并以一个server class实体作为第一引数(argument)。

Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
                                                 126.gif
Date newStart = nextDay(previousEnd);

private static Date nextDay(Date arg) {
    return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
}
posted @ 2005-08-31 14:09 ivaneeo 阅读(159) | 评论 (0)编辑 收藏

范例(Examples)
上一项重构结束时,Person将Department隐藏起来了:
class Person...
    Department _department;
    public Person getManager() {
       return _department.getManager();
    }

class Department...
    private Person _manager;
    public Department(Person manager) {
       _manager = manager;
    }
为了找出某人的经理,客户代码可能这样写:
    manager = john.getManager();
首先在Person中建立一个[受托对象(delegate)取得函数]:
    manager  = john.getDepartment.getManager();
然后逐一处理每个委托函数。

为方便起见,我也可能想要保留一部分委托关系(delegations)。此外我也可能希望对某些客户隐藏委托关系,并让另一些用户直接使用受托对象。
posted @ 2005-08-31 14:03 ivaneeo 阅读(207) | 评论 (0)编辑 收藏

作法(Mechanics)
    • 建立一个函数,用以取用delegate(受托对象)。
    • 对于每个委托函数(delegate method),在server中删除该函数,并将[客户对该函数的调用]替换为[对delegate(受托对象)的调用]。
    • 处理每个委托函数后,编译、测试。
posted @ 2005-08-31 13:54 ivaneeo 阅读(133) | 评论 (0)编辑 收藏

动机(Motivation)
Hide Delegate(157)的[动机]栏,我谈到了[封 装delegated object(受托对象)]的好处。但是这层封装也是要付出代价的,它的代价就是:每当客户要使用delegate(受托类)的新特性时,你就必须在 server端添加一个简单委托函数。随着delegate的特性(功能)越来越多,这一过程会让你痛苦不已。server完全变成了一个[中间人],此 时你就应该让客户直接调用delegate。
posted @ 2005-08-31 13:51 ivaneeo 阅读(129) | 评论 (0)编辑 收藏

某个class做了过多的简单委托动作(simple delegation)。

让客户直接调用delegate(受托类)。

Remove_Middle_Man.png
posted @ 2005-08-31 13:45 ivaneeo 阅读(169) | 评论 (0)编辑 收藏

范例(Examples)
本例从两个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对象:
    manager = john.getDepartment().getManager();
这样的编码就是对客户揭露了Department工作原理,于是客户知道:Department用以追踪[经理]这条信息。如果对客户隐藏Department,可以减少耦合(coupling)。为了这一目的,我在Person中建立一个简单的委托函数:
    public Person getManager() {
       return _department.getManager();
    }
现在,我得修改Person的所有客户,让它们改用新函数:
    manager = john.getManager();
只要完成了对Department所有函数的委托关系,并相应修改了 Person的所有客户,我就可以移除Person中的访问函数个体Department()了。
posted @ 2005-08-31 13:35 ivaneeo 阅读(189) | 评论 (0)编辑 收藏

作法(Mechanics)
    • 对于每一个委托关系中的函数,在server端建立一个简单的委托函数(delegating method)。
    • 调整客户,令它只调用server提供的函数(不得跳过径自调用下层)。
        • ==》如果client(客户)和server不在同一个package,考虑修改委托函数(delegating method)的访问权限,让client得以在package之外调用它。
    • 每次调整后,编译并测试。
    • 如果将来不再有任何客户需要取用图的Delegate(委托类),便可移除server中的相关访问函数(accessor for the delegate)。
    • 编译,测试。
posted @ 2005-08-31 13:21 ivaneeo 阅读(152) | 评论 (0)编辑 收藏

动机(Motivation)
如果某个客户调用了[建立了server object(服务对象)的某个值域基础之上]的函数,那么客户就必须知晓这一委托对象(delegate object)。万一委托关系发生变化,客户也得相应变化。你可以在server端放置一个简单的委托函数(delegating method),将委托关系隐藏起来,从而去除这种依存性。这么一来即便将来发生关系上的变化,变化将被限制在server中,不会涉及客户。

Delegate.png
posted @ 2005-08-31 13:09 ivaneeo 阅读(215) | 评论 (0)编辑 收藏

仅列出标题
共67页: First 上一页 43 44 45 46 47 48 49 50 51 下一页 Last