在软件设计过程中面临着复杂对象的创建工作:其通常有一些稳定的算法构成,由于需求的变化各个子部分通常会发生剧烈的变化
代码报错: "public: __thiscall House::House(void)" (??0House@@QAE@XZ),该符号在函数 "public: __thiscall StoneHouse::StoneHouse(void)" (??0StoneHouse@@QAE@XZ) 中被引用
解决办法:
将纯虚函数提到调用者的前面
现在举例:一个房子需要捡起来,建房子的流程都是一样的,但是不同房子的不同流程具体使用的方法是不一样的。
如下代码所示:Init函数代表构建的流程,不管是StoneHouse还是RiverViewHouse流程都是这样的,但是不同房子各个流程具体实现是不同的。
#pragma once
#include<iostream>
using namespace std;
//房子的构建过程是确定的,即算法是固定的
//但是每种房子各个部分的构造方法是不同的
class House
{
protected:
virtual void ConstructPart1() = 0;
virtual bool ConstructPart2() = 0;
virtual bool ConstructPart3() = 0;
virtual bool ConstructPart4() = 0;
public:
void Init()
{
ConstructPart1();
bool flag = ConstructPart2();
if (flag)
{
flag = ConstructPart3();
}
if (flag)
{
ConstructPart4();
}
}
};
class StoneHouse :public House
{
public:
public:
virtual void ConstructPart1()
{
cout << "StoneHouse ConstructPart1" << endl;
}
virtual bool ConstructPart2()
{
cout << "StoneHouse ConstructPart2" << endl;
return true;
}
virtual bool ConstructPart3()
{
cout << "StoneHouse ConstructPart3" << endl;
return true;
}
virtual bool ConstructPart4()
{
cout << "StoneHouse ConstructPart4" << endl;
return true;
}
};
class RiverViewHouse :public House
{
public:
virtual void ConstructPart1()
{
cout << "RiverViewHouse ConstructPart1" << endl;
}
virtual bool ConstructPart2()
{
cout << "RiverViewHouse ConstructPart2" << endl;
}
virtual bool ConstructPart3()
{
cout << "RiverViewHouse ConstructPart3" << endl;
}
virtual bool ConstructPart4()
{
cout << "RiverViewHouse ConstructPart4" << endl;
}
};
Bulider模式通过上面的方法已经实现:但是我们还可以将对象的构建与对象的表现分离:
如下代码所示:
#pragma once
#include<iostream>
using namespace std;
//房子的构建过程是确定的,即算法是固定的
//但是每种房子各个部分的构造方法是不同的
enum DoorDirection
{
EastDoor, WestDoor, NorthDoor,SouthDoor
};
enum HouseColor
{
Red,Bool,Green,Orange
};
class House
{
public:
virtual HouseColor GetHouseColor() = 0;
};
//将一个复杂对象的构建与表示分离
class HouseBuilder
{
public:
virtual void ConstructPart1() = 0;
virtual bool ConstructPart2() = 0;
virtual bool ConstructPart3() = 0;
virtual bool ConstructPart4() = 0;
public:
House* GetResult()
{
return pHouse;
}
protected:
House* pHouse;
};
class StoneHouse :public House
{
public:
HouseColor GetHouseColor()
{
return HouseColor::Orange;
}
};
class StoneHouseBuilder :public HouseBuilder
{
public:
StoneHouseBuilder()
{
pHouse = new StoneHouse();
}
public:
virtual void ConstructPart1()
{
cout << "StoneHouseBuilder ConstructPart1" << endl;
}
virtual bool ConstructPart2()
{
cout << "StoneHouseBuilder ConstructPart2" << endl;
return true;
}
virtual bool ConstructPart3()
{
cout << "StoneHouseBuilder ConstructPart3" << endl;
return true;
}
virtual bool ConstructPart4()
{
cout << "StoneHouseBuilder ConstructPart4" << endl;
return true;
}
};
//房子的装修这部分也是稳定的,传入什么房子就进行构建什么样的房子
class HouseDirector
{
public:
HouseDirector(HouseBuilder* pHouseBulider)
{
this->pHouseBulider = pHouseBulider;
}
public:
HouseBuilder* pHouseBulider;
House* Construct()
{
pHouseBulider->ConstructPart1();
bool flag = pHouseBulider->ConstructPart2();
if (flag)
{
flag = pHouseBulider->ConstructPart3();
}
if (flag)
{
pHouseBulider->ConstructPart4();
}
return pHouseBulider->GetResult();
}
};
class RiverViewHouse :public House
{
};
测试:
#include"House.h"
int main()
{
//House* phouse = new StoneHouse();
//phouse->Init();
House* pHouse = new StoneHouse();
//具体装修那种房子
HouseBuilder* pHouseBulider = new StoneHouseBuilder();
//房子装修
HouseDirector* pHouseDirector = new HouseDirector(pHouseBulider);
pHouse = pHouseDirector->Construct();
int color = pHouse->GetHouseColor();
cout << color << endl;
return 0;
}