將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
#include "pch.h"
#include <iostream>
using namespace std;
/*************************************************************************
*將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
*這裏以捏小人爲例,一個
*通常由多個固定的簡單子對象組成一個總對象,這些簡單的對象具有不同的屬性,如:
人由膚色、身高、體重等可以分爲黑高瘦、白矮胖等;
電腦由主板、CPU、內存、硬盤等可以分爲商務本、遊戲本、一體機等;
守望先鋒英雄由shift技能、e技能、q大招等可以分爲大錘、裂空、法雞等;
注意:如果要頻繁增減這些子對象,此模式不適用,違反開閉原則。
*************************************************************************/
class HeroBuilder
{
public:
virtual void SkillShift() = 0;
virtual void SkillE() = 0;
virtual void SkillQ() = 0;
};
class LiekongBuilder : public HeroBuilder//裂空
{
public:
LiekongBuilder()
{
cout << "裂空的技能" << endl;
}
void SkillShift()
{
cout << "SHIFT:閃現" << endl;
}
void SkillE()
{
cout << "E:閃回" << endl;
}
void SkillQ()
{
cout << "Q:脈衝炸彈" << endl;
}
};
class FajiBuilder : public HeroBuilder//法雞
{
public:
FajiBuilder()
{
cout << "法雞的技能" << endl;
}
void SkillShift()
{
cout << "SHIFT:飛起" << endl;
}
void SkillE()
{
cout << "E:衝擊波" << endl;
}
void SkillQ()
{
cout << "Q:天降正義" << endl;
}
};
class HeroDirector
{
private:
HeroBuilder *hero;
public:
HeroDirector(HeroBuilder *h)
{
hero = h;
}
void CreateHero()
{
/*複雜對象的構建,同樣的構建過程可以創建不同的表示*/
/*每個英雄都是這些技能,不會增減*/
hero->SkillShift();
hero->SkillE();
hero->SkillQ();
}
};
int main()
{
HeroDirector *director;
HeroBuilder *faji = new FajiBuilder();
director = new HeroDirector(faji);
director->CreateHero();
/*如果要增加一個英雄,只需要繼承HeroBuilder後賦予屬於自己的技能就可以了*/
HeroBuilder *Liekong = new LiekongBuilder();
director = new HeroDirector(Liekong);
director->CreateHero();
}