A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-1-14 09:40  /  386 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Inline Class

某个类并没有做太多的事情。应该将这个类的所有特性搬移到另一个类中,然后移除原类。

过程与Extract Class相反,不再做介绍。

Hide Delegate
2019010909543236.png
客户通过一个委托关系来调用另一个对象。应当在服务类上建立客户所需的所有函数,用以隐藏委托关系。

动机:
我们都知道,”封装“即使不是对象的最为关键的特征,也是最为关键的特征之一。 ”封装“意味着每个对象都应该尽可能少了解系统的其它部分。这样,一旦发生变化,需要了解这一变化的对象就会比较少——这会使变化比较容易。
如果某个客户先通过服务对象的字段得到了另一个对象,然后调用后者的函数,那么客户就必须知晓这一层委托关系。万一委托关系发生了变化,那么客户也得相应改变。那么,我们可以再服务器对象上放置一个简单的委托函数,将委托关系隐藏起来,从而去除这种依赖。这样,即使在将来委托关系发生变化,也只在服务器对象中,而不会涉及客户。 简而言之,就是多加一个中介。
20190109095638484.png
范例

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
20190109100651816.png

1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马