设计模式:装饰模式(C++)【小明习武闯天下】
生活随笔
收集整理的這篇文章主要介紹了
设计模式:装饰模式(C++)【小明习武闯天下】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
序言
這集帶來(lái)大家一起學(xué)下裝飾模式。裝飾模式 看名字就能 ?猜到是干啥 就是用來(lái) 搞裝修進(jìn)行裝飾的 嘛!沒(méi)毛病,其實(shí)裝飾模式 確實(shí)是用來(lái)裝飾對(duì)象的 而且是為了解耦的。我們知道 類(lèi)是生成對(duì)象的模板,我們?nèi)绻龅脝我宦氊?zé)的話,那么每增加一個(gè)不一樣的屬性,都要添加一個(gè)新的子類(lèi),這樣就會(huì)有很多種類(lèi)。或許這些屬性可能還不是通用的。那么怎樣來(lái)解決呢?或許我們可以將那些要添加的屬性或者動(dòng)作 封裝成 裝飾器,你要啥 我就裝飾啥唄。下面請(qǐng)看下面的裝飾器的標(biāo)準(zhǔn)類(lèi)圖。
裝飾模式標(biāo)準(zhǔn)類(lèi)圖
裝飾模式案例
小明習(xí)武闖天下
小明同學(xué)是我們的主人公,它是我們需要修飾的對(duì)象。起初他只是一名學(xué)生普通人一個(gè)。后面 習(xí)武->六脈神劍->打狗棒->降龍18掌,各種屬性值持續(xù)上升, 然后走上人生巔峰。當(dāng)然我們后面添加的這些 功能 得用 裝飾模式唄。用繼承不合理吧。
小明習(xí)武類(lèi)型圖
小明習(xí)武代碼實(shí)現(xiàn)
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std;//人物角色接口 待裝飾抽象基類(lèi) class Hero { public:virtual void showStatus() = 0; public:int m_ATK;//攻擊力int m_DEF;//防御力int m_Power;//內(nèi)功int m_Look;//顏值string m_Name; }; //學(xué)生 具體待裝飾的類(lèi) class Student :public Hero { public:Student(string name){m_ATK = 0;m_DEF = 0;m_Power = 0;m_Look = 10;//學(xué)生初始有顏值m_Name = name;}virtual void showStatus(){cout << m_Name <<" 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內(nèi)功:" << m_Power << " 顏值:" << m_Look << endl;} }; //抽象技能類(lèi)(裝飾類(lèi)的基類(lèi)) ,學(xué)習(xí)武功 還是一個(gè)人,裝飾類(lèi) 很重要一點(diǎn),有指向待裝飾對(duì)象的指針 ,這樣就可以 在要裝飾對(duì)象 上裝飾東西 或者 做一些動(dòng)作 class AbstractSkillDecorator:public Hero { public:AbstractSkillDecorator(Hero* hero){this->hero = hero;} protected:Hero* hero; };//學(xué)習(xí) 六脈神劍,具體的裝飾類(lèi) ,學(xué)習(xí)之后 攻擊力和顏值 增加 class SexSwordDecorator :public AbstractSkillDecorator { public:SexSwordDecorator(Hero* hero):AbstractSkillDecorator(hero){}virtual void showStatus(){addSkill();//增加技能cout << m_Name << " 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內(nèi)功:" << m_Power << " 顏值:" << m_Look << endl;} private://裝飾類(lèi) 增加動(dòng)作,修飾待裝飾對(duì)象herovoid addSkill(){this->m_ATK = hero->m_ATK + 100;this->m_DEF = hero->m_DEF;this->m_Power = hero->m_Power;this->m_Look = hero->m_Look + 100;this->m_Name = hero->m_Name;delete hero;} }; //學(xué)習(xí)丐幫的打狗棒,學(xué)習(xí)后 防御力增加100,顏值下降200 o(╥﹏╥)o class HitDogDecorator :public AbstractSkillDecorator { public:HitDogDecorator(Hero* hero):AbstractSkillDecorator(hero){}virtual void showStatus() {addSkill();cout << "一不小心成了:" << newId << endl;cout << m_Name << " 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內(nèi)功:" << m_Power << " 顏值:" << m_Look << endl;} private://裝飾類(lèi) 增加動(dòng)作,修飾待裝飾對(duì)象herovoid addSkill(){this->m_ATK = hero->m_ATK;this->m_DEF = hero->m_DEF + 100;this->m_Power = hero->m_Power;this->m_Look = hero->m_Look - 200;this->m_Name = hero->m_Name;this->newId = "丐幫幫主";delete hero;} private:string newId;//裝飾類(lèi)增加狀態(tài),修飾hero對(duì)象 }; //學(xué)習(xí)降龍18掌,學(xué)習(xí)后 內(nèi)力 暴增 + 200 class Dragon18Decorator :public AbstractSkillDecorator { public:Dragon18Decorator(Hero* hero) :AbstractSkillDecorator(hero){}virtual void showStatus(){addSkill();cout << m_Name << " 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內(nèi)功:" << m_Power << " 顏值:" << m_Look << endl;} private://裝飾類(lèi) 增加動(dòng)作,修飾待裝飾對(duì)象herovoid addSkill(){this->m_ATK = hero->m_ATK;this->m_DEF = hero->m_DEF;this->m_Power = hero->m_Power + 200;this->m_Look = hero->m_Look;this->m_Name = hero->m_Name;delete hero;} };int main(int argc, char *argv[]) {//小明剛開(kāi)始是學(xué)生,但是它有個(gè)英雄夢(mèng),從此踏入武林Hero* xiaoMing = new Student("小明");cout << "小明還是學(xué)生時(shí)----------" << endl;xiaoMing->showStatus();//被裝飾類(lèi)裝飾后,原對(duì)象是否要進(jìn)行釋放 視情況而定 。//這里我們不再需要原對(duì)象,所有在裝飾類(lèi)中裝飾完原對(duì)象,就將原對(duì)象釋放。//小明學(xué)武 -> 六脈神劍->打狗棒-> 降龍18掌xiaoMing = new SexSwordDecorator(xiaoMing);cout << "學(xué)習(xí)六脈神劍后----------" << endl;xiaoMing->showStatus();xiaoMing = new HitDogDecorator(xiaoMing);cout << "學(xué)習(xí)打狗棒后------------" << endl;xiaoMing->showStatus();xiaoMing = new Dragon18Decorator(xiaoMing);cout << "學(xué)習(xí)降龍18掌后------------" << endl;xiaoMing->showStatus();return EXIT_SUCCESS; }運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的设计模式:装饰模式(C++)【小明习武闯天下】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CFileDialog获取文件与文件夹路
- 下一篇: DOS中断大全