1.3.3 优化设计
1.3.2小节中对最初的Car类进行了设计,并且完成了对应的代码,根据1.3.2小节代码中的各个类的组成及类间关系,绘制优化设计后的EIT造型的UML类图,如图1-11所示。
▲图1-11 优化后的EIT造型
与图1-10相比,优化后的EIT造型多了一个接口类对象SetTireInterface(EIT中的I),这个接口类对象替代了原来的接口方法SetDiffTire(string tire);EIT中的E和T保持不变,并且在E的Car对象中包含接口类对象SetTireInterface的成员变量,Car对象中的接口类对象SetTireInterface在构造Car对象的同时被赋值为m_Interface,并且在调用Car对象的DiffTire()方法中完成对SetDiffTire()的间接控制。
但是,这个优化后的SetTireInterface与DZInterface仍然存在继承泛化关系,能否将两者改成关联关系呢?这里考虑将接口及派生类分离成两个独立类,整个流程代码完善后的结果如下。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; class SetTireInterface; //派生类DZ对象 class DZ { public: DZ(){} void SetDiffTire(string tire) { cout<<"setDiffTire is: "<<tire<<endl;; } }; //派生类对象独立于接口类 class SetTireInterface { public: SetTireInterface() { m_dzInterface = new DZ(); } void EnableSetDiffTire(string tire) { m_dzInterface->SetDiffTire(tire); } protected: DZ* m_dzInterface; }; //Car类与接口单向关联 class Car { public: Car(string en):engineName(en) { m_Interface = new SetTireInterface(); } void SetCommonEngine() { cout<<"commonEngine is: "<< engineName<<endl; } void DiffTire(string tire) { m_Interface->EnableSetDiffTire(tire); } protected: string engineName; SetTireInterface* m_Interface; }; //客户端主程序 int main() { Car *car = new Car("weichai"); car->SetCommonEngine(); car->DiffTire("miqilin"); delete car; }
去除继承泛化关系后的优化方案的代码如上,根据以上代码绘制的UML类图如图1-12所示。
图1-12说明了再次优化后由继承泛化关系变成关联关系的EIT造型的组成,Car对象与SetTireInterface对象为单向关联关系,Car对象包含SetTireInterface对象的成员变量,成员函数与图1-11保持一致;DZ对象与SetTireInterface对象为双向关联关系,DZ对象包含SetTireInterface对象的成员变量,SetTireInterface对象包含DZ对象的成员变量,SetTireInterface对象的成员方法EnableSetTireInterface(string tire)中完成对SetDiffTire(string tire)的关联控制。
图1-12中,Car、SetTireInterface、DZ之间的关联替代图1-11中SetTireInterface与DZInterface之间的继承泛化,使SetTireInterface与DZ实现解耦,方便后续开发者对程序进行扩展和维护,实现可靠、完美的软件设计。
▲图1-12 关联关系的EIT造型