想必很多少男少女都玩过给公主换衣服的小游戏,我们如何用代码模拟这一过程呢?要求是我们需要给三个国家的不同公主完成戴帽子、穿衣服、穿鞋子三个不同的动作(我们用Id表示公主服装的编号)。
#include <iostream>
using namespace std;
namespace _ChangeTheSuit{
class Princess {
public:
/*
virtual void PutOnTheHat(string Id) = 0;
virtual void PutOnTheClothes(string Id) = 0;
virtual void PutOnTheShoes(string Id) = 0;
void Assemble(string Id) {
PutOnTheHat(Id.substr(1, 3));
PutOnTheClothes(Id.substr(4, 6));
PutOnTheShoes(Id.substr(7, 9));
}*/
virtual ~Princess() {}
};
class ChinesePrincess : public Princess {
public:
/*virtual void PutOnTheHat(string Id) {
cout << "帮中国公主戴上帽子" << endl;
}
virtual void PutOnTheClothes(string Id) {
cout << "帮中国公主穿上衣服" << endl;
}
virtual void PutOnTheShoes(string Id) {
cout << "帮中国公主穿上鞋子" << endl;
}*/
};
class AmericaPrincess : public Princess {
public:
/*virtual void PutOnTheHat(string Id) {
cout << "帮美国公主戴上帽子" << endl;
}
virtual void PutOnTheClothes(string Id) {
cout << "帮美国公主穿上衣服" << endl;
}
virtual void PutOnTheShoes(string Id) {
cout << "帮美国公主穿上鞋子" << endl;
}*/
};
class EnglandPrincess : public Princess {
public:
/*virtual void PutOnTheHat(string Id) {
cout << "帮英国公主戴上帽子" << endl;
}
virtual void PutOnTheClothes(string Id) {
cout << "帮英国公主穿上衣服" << endl;
}
virtual void PutOnTheShoes(string Id) {
cout << "帮英国公主穿上鞋子" << endl;
}*/
};
class PrincessBuilder {
public:
virtual ~PrincessBuilder() {}
virtual void PutOnTheHat(string Id) = 0;
virtual void PutOnTheClothes(string Id) = 0;
virtual void PutOnTheShoes(string Id) = 0;
/*void Assemble(string Id) {
PutOnTheHat(Id.substr(1, 3));
PutOnTheClothes(Id.substr(4, 6));
PutOnTheShoes(Id.substr(7, 9));
}*/
Princess* GetPrincess() {
return m_princess;
}
protected:
Princess* m_princess;
};
class ChinesePrincessBulider : public PrincessBuilder {
public:
ChinesePrincessBuilder() {
m_princess = new ChinesePrincess();
}
virtual void PutOnTheHat(string Id) {
cout << "帮中国公主戴上帽子" << endl;
}
virtual void PutOnTheClothes(string Id) {
cout << "帮中国公主穿上衣服" << endl;
}
virtual void PutOnTheShoes(string Id) {
cout << "帮中国公主穿上鞋子" << endl;
}
};
class AmericanPrincessBulider : public PrincessBuilder {
public:
AmericanPrincessBuilder() {
m_princess = new AmericanPrincess();
}
virtual void PutOnTheHat(string Id) {
cout << "帮美国公主戴上帽子" << endl;
}
virtual void PutOnTheClothes(string Id) {
cout << "帮美国公主穿上衣服" << endl;
}
virtual void PutOnTheShoes(string Id) {
cout << "帮美国公主穿上鞋子" << endl;
}
};
class EnglandPrincessBulider : public PrincessBuilder {
public:
EnglandPrincessBuilder() {
m_princess = new EnglandPrincess();
}
virtual void PutOnTheHat(string Id) {
cout << "帮英国公主戴上帽子" << endl;
}
virtual void PutOnTheClothes(string Id) {
cout << "帮英国公主穿上衣服" << endl;
}
virtual void PutOnTheShoes(string Id) {
cout << "帮英国公主穿上鞋子" << endl;
}
};
class PrincessDirector {
public:
PrincessDirector(PrincessBuilder* tempPBuilder) {
m_PrincessBuilder = tempPBuilder;
}
Princess* Constructor(string Id) {
m_PrincessBuilder->PutOnTheHat(Id.substr(1, 3));
m_PrincessBuilder->PutOnTheClothes(Id.substr(4, 6));
m_PrincessBuilder->PutOnTheShoes(Id.substr(7, 9));
return m_PrincessBuilder->GetPrincess();
}
private:
PrincessBuilder* m_PrincessBuilder;
};
};
int main() {
/*_ChangeTheSuit::Princess* my_princess = new _ChangeTheSuit::ChinesePrincess();
my_princess->Assemble("123456789");*/
_ChangeTheSuit::PrincessBuilder* my_builder = new _ChangeTheSuit::ChinesePrincessBulider();
_ChangeTheSuit::PrincessDirector* my_director = new _ChangeTheSuit::PrincessDirector(my_builder);
_ChangeTheSuit::Princess* my_Princess = my_director->Constructor("123456789");
delete my_builder;
delete my_director;
getchar();
return 0;
}
由以上模拟代码可以看出:
- 我们使用Princess类和它的三个子类作为描述公主的类;
- 使用PrincessBuilder和它的三个子类类来创建公主;
- 使用PrincessDirector来完成公主的穿衣动作;
也就是:
建造者(Builder)模式
建造者(Builder)模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
PrincessBuilder类就是对象的构建,Princess类是对象的表示。
建造者模式包含四种角色:
a)Builder(抽象构建器):这里指PrincessBuilder。
b)ConcreteBuilder(具体构建器):这里指EnglandPrincessBulider、ChinesePrincessBulider、AmericanPrincessBulider类。
c)Product(产品):这里指EnglandPrincess、EnglandPrincess、EnglandPrincess。
d)Director(指挥者):PrincessDirector类。
适用于以下情况:
1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2)当构造过程必须允许被构造的对象有不同的表示时。