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展现了组合设计模式的构成部分,是后续讲解设计原则和设计模式的基础和关键。