版权声明:请注明转发出处 https://blog.csdn.net/mafucun1988/article/details/89391382
《重构:改善既有代码的设计》中提到过很多重构方法,关于在对象之间搬移特性的方法有8种。本文介绍:
移除中间人 remove middle man
- 名称: 移除中间人 remove middle man
- 概要:某个类做了过多的简单委托动作,让客户直接调用受托类
- 动机:每当客户使用受托类的 新特性,就要在服务端增加一个简单委托函数,当受托类越来越多的时候,就会导致服务类完全变成了一个“中间人”
- 做法:
- 建立一个函数,用以获得受托对象
- 对于每个委托函数,在服务类中删除该函数,并让需要调用该函数的客户转为调用受托对象
- 处理每个委托函数后,编译,测试
- 代码演示
修改之前的代码:
///////////////////////////.h
#ifndef REFACTORMOVE_H
#define REFACTORMOVE_H
class Department;
class Person
{
public:
QString GetName();
QString GetOfficeAreaCode();
void SetOfficeAreaCode(QString officeAreaCode);
Department* GetDepartment();
void SetDepartment(Department *pdepartment);
Person GetManager();
private:
QString m_Name;
QString m_OfficeAreaCode;
TelephoneNumber m_TelephoneNumber;
Department *m_pDepartment;
};
class Department
{
public:
Department(Person manager);
Person GetManager();
private:
QString m_ChargeCode;
Person m_Manager;
};
#endif // REFACTORMOVE_H
///////////////////////////.cpp
#include "RefactorMove.h"
Department* Person::GetDepartment()
{
return m_pDepartment;
}
void Person::SetDepartment(Department *pdepartment)
{
m_pDepartment = pdepartment;
}
Person Person::GetManager()
{
return m_pDepartment->GetManager();
}
Department::Department(Person manager)
{
m_Manager = manager;
}
Person Department::GetManager()
{
return m_Manager;
}
///////////////////////////main.cpp
Person person;
Department department(person);
Person manager = person.GetManager();
修改之后的代码:
///////////////////////////.h
#ifndef REFACTORMOVE_H
#define REFACTORMOVE_H
class Department;
class Person
{
public:
QString GetName();
QString GetOfficeAreaCode();
void SetOfficeAreaCode(QString officeAreaCode);
Department* GetDepartment();
void SetDepartment(Department *pdepartment);
private:
QString m_Name;
QString m_OfficeAreaCode;
TelephoneNumber m_TelephoneNumber;
Department *m_pDepartment;
};
class Department
{
public:
Department(Person manager);
Person GetManager();
private:
QString m_ChargeCode;
Person m_Manager;
};
#endif // REFACTORMOVE_H
///////////////////////////.cpp
Department* Person::GetDepartment()
{
return m_pDepartment;
}
void Person::SetDepartment(Department *pdepartment)
{
m_pDepartment = pdepartment;
}
Department::Department(Person manager)
{
m_Manager = manager;
}
Person Department::GetManager()
{
return m_Manager;
}
///////////////////////////main.cpp
Person person;
Department department(person);
Person manager = person.GetDepartment()->GetManager();