日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

设计模式:装饰模式(C++)【小明习武闯天下】

發(fā)布時間:2025/3/15 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式:装饰模式(C++)【小明习武闯天下】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

序言

這集帶來大家一起學下裝飾模式。裝飾模式 看名字就能 ?猜到是干啥 就是用來 搞裝修進行裝飾的 嘛!沒毛病,其實裝飾模式 確實是用來裝飾對象的 而且是為了解耦的。我們知道 類是生成對象的模板,我們如果要做得單一職責的話,那么每增加一個不一樣的屬性,都要添加一個新的子類,這樣就會有很多種類?;蛟S這些屬性可能還不是通用的。那么怎樣來解決呢?或許我們可以將那些要添加的屬性或者動作 封裝成 裝飾器,你要啥 我就裝飾啥唄。下面請看下面的裝飾器的標準類圖。

裝飾模式標準類圖


裝飾模式案例

小明習武闖天下

小明同學是我們的主人公,它是我們需要修飾的對象。起初他只是一名學生普通人一個。后面 習武->六脈神劍->打狗棒->降龍18掌,各種屬性值持續(xù)上升, 然后走上人生巔峰。當然我們后面添加的這些 功能 得用 裝飾模式唄。用繼承不合理吧。

小明習武類型圖


小明習武代碼實現(xiàn)

#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std;//人物角色接口 待裝飾抽象基類 class Hero { public:virtual void showStatus() = 0; public:int m_ATK;//攻擊力int m_DEF;//防御力int m_Power;//內功int m_Look;//顏值string m_Name; }; //學生 具體待裝飾的類 class Student :public Hero { public:Student(string name){m_ATK = 0;m_DEF = 0;m_Power = 0;m_Look = 10;//學生初始有顏值m_Name = name;}virtual void showStatus(){cout << m_Name <<" 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內功:" << m_Power << " 顏值:" << m_Look << endl;} }; //抽象技能類(裝飾類的基類) ,學習武功 還是一個人,裝飾類 很重要一點,有指向待裝飾對象的指針 ,這樣就可以 在要裝飾對象 上裝飾東西 或者 做一些動作 class AbstractSkillDecorator:public Hero { public:AbstractSkillDecorator(Hero* hero){this->hero = hero;} protected:Hero* hero; };//學習 六脈神劍,具體的裝飾類 ,學習之后 攻擊力和顏值 增加 class SexSwordDecorator :public AbstractSkillDecorator { public:SexSwordDecorator(Hero* hero):AbstractSkillDecorator(hero){}virtual void showStatus(){addSkill();//增加技能cout << m_Name << " 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內功:" << m_Power << " 顏值:" << m_Look << endl;} private://裝飾類 增加動作,修飾待裝飾對象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;} }; //學習丐幫的打狗棒,學習后 防御力增加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 << " 內功:" << m_Power << " 顏值:" << m_Look << endl;} private://裝飾類 增加動作,修飾待裝飾對象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;//裝飾類增加狀態(tài),修飾hero對象 }; //學習降龍18掌,學習后 內力 暴增 + 200 class Dragon18Decorator :public AbstractSkillDecorator { public:Dragon18Decorator(Hero* hero) :AbstractSkillDecorator(hero){}virtual void showStatus(){addSkill();cout << m_Name << " 攻擊力:" << m_ATK << " 防御力:" << m_DEF << " 內功:" << m_Power << " 顏值:" << m_Look << endl;} private://裝飾類 增加動作,修飾待裝飾對象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[]) {//小明剛開始是學生,但是它有個英雄夢,從此踏入武林Hero* xiaoMing = new Student("小明");cout << "小明還是學生時----------" << endl;xiaoMing->showStatus();//被裝飾類裝飾后,原對象是否要進行釋放 視情況而定 。//這里我們不再需要原對象,所有在裝飾類中裝飾完原對象,就將原對象釋放。//小明學武 -> 六脈神劍->打狗棒-> 降龍18掌xiaoMing = new SexSwordDecorator(xiaoMing);cout << "學習六脈神劍后----------" << endl;xiaoMing->showStatus();xiaoMing = new HitDogDecorator(xiaoMing);cout << "學習打狗棒后------------" << endl;xiaoMing->showStatus();xiaoMing = new Dragon18Decorator(xiaoMing);cout << "學習降龍18掌后------------" << endl;xiaoMing->showStatus();return EXIT_SUCCESS; }

運行結果




總結

以上是生活随笔為你收集整理的设计模式:装饰模式(C++)【小明习武闯天下】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。