C++设计模式
上QQ阅读APP看书,第一时间看更新

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造型