重构读书笔记-7_5_Hide_Delegate

重构第七章

5.Hide Delegate(隐藏委托)

客户端直接调用server object(服务对象)的delegate class。在server端建立客户端所需的所有函数,用以隐藏委托关系

Example:

class Person {
    Department _department;
    
    public Department getDepartment() {
        return _department;
    }

    public void setDepartment(Department arg) {
        _department = arg;
    }
};

class Department {
    private string _chargeCode;
    private Person _maneger;
    
    public Department(Person manager) {
        _manager = manager;
    }
    public Person getManager() {
        return _manager;
    }
};

Analyse:

上面的示例代码,表示的应该是server object(服务对象)的实现。
用户即客户端希望得到一个Person的Manage。
manager= john.getDepartment().getManager();
用户能通过以上代码,知道Department用来追踪manager的信息。
在Person中建立一个简单的委托函数:
public Person getManager() {
    return _department.getManager();
}

客户端调用修改为:
manager = john.getManager();

End:

class Person {
    Department _department;

    public void setDepartment(Department arg) {
        _department = arg;
    }

    public Person getManager() {
        return _department.getManager();
    }
};

class Department {
    private string _chargeCode;
    private Person _maneger;
    
    public Department(Person manager) {
        _manager = manager;
    }
    public Person getManager() {
        return _manager;
    }
};

Conclusion:

在示例中,如果Person和Department类之间的委托关系发生变化,客户也需要进行相应的变化。
在重构之后,如果Person和Department类之间的委托关系发生变化,客户不需要变化,变化限定在server object中。

同时,可能调用getDepartment的地方有很多处,如果server object 不再提供这个接口,或者这个接口由于一点原因,不在兼容的情况下,可能修改的位置会有很多的地方。
而同一封装在Person中,客户不需要对其代码进行任何的修改,具体的修改内容局限在了server object内,扩展更加的方便。

注意

重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!

你可能感兴趣的:(重构读书笔记-7_5_Hide_Delegate)