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