策略模式(並複習工廠方法模式)

2021-09-25 18:24:31 字數 1399 閱讀 9159

最近拿出了以前看過的一本《大話設計模式》重新翻閱,發現在工作中看的原始碼確實對自己的提公升挺大的,所以這一遍的看書效率比較搞。

在看了大半本之後發現設計模式中聚合這一方法用得比較多,如**,橋接,裝飾還有今天寫的策略模式都有用到(當然還有更多)。更驚奇的是自己對開閉這一原則有了更加深刻的認識,以至在寫這次的demo中很自然得就用上了抽象工廠模式。

首先,書中提到,策略模式就是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規則。在本例中,我以遊戲中的出裝(攻防裝)為例,順風(hp高於50)出攻擊裝,否則出防裝。

定義策略抽象類(此處為裝備方案)

class cequipment	//裝備抽象類,在策略模式中為策略類

;

定義裝備的兩個派生類,由於繼承自抽象類,使得要增加新的出裝方案可以繼續繼承自抽象類,滿足「對拓展開放,對修改封閉」的理念。

class cplana :public cequipment

private:

};class cplanb :public cequipment

};

定義乙個玩家的具象類,此類內聚了乙個裝備方案的指標,使得可由此類呼叫方案的實施,而不必知曉方案具體的實現細節。

class cplayer	//玩家類 維護乙個cequipment類

cequipment* getdataptr()

private:

cequipment* m_ptr;

};

下面是工廠方法設計模式,建立乙個工廠抽象類,並用子類去繼承,工廠類用於建立乙個具體方案(在客戶端判斷hp,然後決定具體new 哪乙個子類)

下面是乙個抽象工廠類和兩個派生類,由於定義了抽象類,使得要建立新的工廠的話不必對原有的工廠類進行修改,這也是工廠方法模式優於簡單工廠模式的地方。

class cfactory

;class cplanafac:public cfactory

};class cplanbfac :public cfactory

};

最後是客戶端的呼叫,美中不足的是需要讓客戶端實現判斷,來決定需要建立哪個工廠類,以實現生產出適合的plan

int main()

else

fac = new cplanbfac();

//父類指標指向子類物件,典型的多型

cequipment* equip=fac->createplan();

//利用cequipment* 初始化 cplayer的私有變數

cplayer* player = new cplayer(equip);

player->getdataptr()->plan();

簡單工廠模式 策略模式與工廠方法模式

用三種設計模式實現同一種功能 四則運算。三種設計模式相同的部分為四則運算類的設計,包括基類,加法運算類,減法運算類,乘法運算類和除法運算類,其 如下 class cclac class cclacadd public cclac class cclacsub public cclac class c...

工廠方法模式 工廠方法模式

工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...

工廠方法模式 工廠方法模式 二

工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...