Inline Class
某个类并没有做太多的事情。应该将这个类的所有特性搬移到另一个类中,然后移除原类。
过程与Extract Class相反,不再做介绍。
Hide Delegate
客户通过一个委托关系来调用另一个对象。应当在服务类上建立客户所需的所有函数,用以隐藏委托关系。
动机:
我们都知道,”封装“即使不是对象的最为关键的特征,也是最为关键的特征之一。 ”封装“意味着每个对象都应该尽可能少了解系统的其它部分。这样,一旦发生变化,需要了解这一变化的对象就会比较少——这会使变化比较容易。
如果某个客户先通过服务对象的字段得到了另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生了变化,那么客户也得相应改变。那么,我们可以再服务器对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这样,即使在将来委托关系发生变化,也只在服务器对象中,而不会涉及客户。 简而言之,就是多加一个中介。
范例
class Person{
Department _department;
public Department get_department() {
return _department;
}
public void set_department(Department _department) {
this._department = _department;
}
}
class Department{
private String _changeCode;
private Person _manager;
public Person get_manager() {
return _manager;
}
public void set_manager(Person _manager) {
this._manager = _manager;
}
//......
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
如果客户想要知道某人的经理是谁,他必须先取得Department对象:
Person john = new Person();
Person manager = john.get_department().get_manager();
1
2
这样的编码对客户暴露了Department的工作原理,于是客户知道;Department用以追踪“经理”这条信息。如果对客户隐藏Department,可以减少耦合。为了到达预期的目的,在Person中建立一个简单的委托函数:
public Person getManager(){
return _department.get_manager();
}
1
2
3
现在,需要修改Person的所有用户,让它们使用新的函数:
Person manager = john.getManager();
1
Remove Middle Man
某个类做了过多的简单委托动作。应当让客户直接调用受托类。
与前者逆过程,不介绍。
Introduce Foreign Method
你需要为提供服务的类增加一个函数,但你无法修改这个类。应该在客户类中建立一个函数,并以第一参数形式传入一个服务器类实例。
//before
Date newStart = new Date(previous.getYear(),
previous.getMonth(),previous.getDate() + 1);
1
2
3
4
|
|