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

1.4 组合设计模式

1.1节中讲解的类方法表明了类内的关系,1.2节中讲解的UML类图描述了类与类之间的关系,将其抽象成一个固定公式,即1.3节中讲解的EIT造型。EIT造型通过对UML类图中各个关系的排列组合与应用,实现软件基本架构的搭建与设计。

软件架构设计的基础就是抽离出公共部分进行复用,作为E;最主要的工作就是设计出接口,作为I;最后设计出可更换的T。两个或两个以上EIT造型组合就成了组合设计模式。从图1-13可以清晰地看出类与类、类与EIT造型、EIT造型与EIT造型等之间的进阶关系。

▲图1-13 类、UML类图、EIT造型
之间的关系

图1-13说明了类、UML类图、EIT造型之间的关系,类对象与类对象之间是通过UML类图进行组合、继承、关联或依赖的,类对象加上接口方法构成了EIT造型,各个EIT造型之间的排列组合构成了组合设计模式。将这种类、UML类图、EIT造型之间按层次递进的关系呈现出来,可使读者更容易理解组合设计模式的由来和组成,这三者是设计模式理论基础的核心,介绍它们之间的关系可为组合设计模式的展开说明奠定基础。

将组合设计模式的思想应用到1.1节介绍的类方法中,Car类与DZ类构成一个EIT1造型,其中SetDiffTire()传参改为Car类的成员变量,代码设计如下。

#include <iostream>
#include <cstring>
#include <algorithm>
 
using namespace std;
//EIT1造型:Car、SetDiffTire()和DZ
class Car
{
    public:
        Car(){}
        Car(string en):engineName(en){}
        void SetCommonEngine(){cout<<"commonEngine is: "<< engineName<<endl;}
        virtual string SetDiffTire() = 0;
    public:
        string engineName;
        string tireName;
};
 
class DZ:public Car
{
    public:
        DZ():Car(){}
        DZ(string en):Car(en){}
        string SetDiffTire()
        {
            return tireName;
        }    
};

不同种类的汽车轮胎由固定的工厂进行加工制造,例如,“miqilin”轮胎有自己的“miqilin”工厂,工厂加工出轮胎后,应用在小码路购买的DZ品牌汽车上。同理,轮胎工厂和“miqilin”轮胎工厂组成一个EIT2造型,代码设计如下。

//EIT2造型 CreateCarTire、ReturnCarName()和 MQLTireFactory
class CreateCarTire
{
    public:
        Car* ProductCar()
        {
            return ReturnCarName();
        }
        virtual Car* ReturnCarName()=0;
};
 
class MQLTireFactory:public CreateCarTire
{
    public:
        Car* ReturnCarName()
        {
           Car *car = new DZ();
           return car;
        }
};

如图1-13所示,将不同的EIT造型组合在一起可以得到软件的基本架构,本案例中将EIT1造型与EIT2造型关联在一起,EIT1造型通过构造Car对象,调用SetCommonEngine()方法输出轮胎类型,EIT2造型通过构造CreateCarTire对象,设定CreateCarTire的轮胎名称tireName,最终调用SetDiffTire()方法实现“DZ使用miqilin轮胎”的过程,客户端主程序如下。

//客户端主程序
int main()
{
    Car *car = new DZ("weichai");
 
    car->SetCommonEngine();
    
    CreateCarTire* createCarTire = new MQLTireFactory();
    Car *carSetTire = createCarTire->ProductCar();
    carSetTire->tireName = "miqilin";
    cout<<carSetTire->SetDiffTire()<<endl;
    delete car;
}

根据以上设计流程,将两个或两个以上的EIT造型以不同的方式组合在一起,形成了组合设计模式。EIT1造型和EIT2造型组合构成的设计模式的UML类图如图1-14所示。

▲图1-14 EIT造型组合构成的设计模式的UML类图

图1-14说明了EIT造型组合构成组合设计模式的过程,EIT1造型由类对象Car、接口方法SetDiffTire()、类对象DZ组成,Car类包含公有成员变量引擎名称engineName和轮胎名称tireName、两个类构造函数Car()和Car(string en)、公有的引擎方法SetCommonEngine(),DZ类实现具体的SetDiffTire()方法;EIT2造型由类对象CreateCarTire、接口方法ReturnCarName()、类对象MQLTireFactory组成,CreateCarTire类包含公有成员生产汽车方法ProductCar(),MQLTireFactory类实现具体的ReturnCarName()。图1-14展现了组合设计模式的构成部分,是后续讲解设计原则和设计模式的基础和关键。