C++设计模式——建造者(Builder)模式:给公主换衣服

想必很多少男少女都玩过给公主换衣服的小游戏,我们如何用代码模拟这一过程呢?要求是我们需要给三个国家的不同公主完成戴帽子、穿衣服、穿鞋子三个不同的动作(我们用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)当构造过程必须允许被构造的对象有不同的表示时。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值