設計模式-Strategy 模式
1. 解決的問題:假如現在要編寫一個射擊類小遊戲, 遊戲裡面有不同層級的遊戲角色, 這些角色可以使用不同的武器.
2. 問題分析:角色應該可以動態更換武器, 今後可能增加其他的角色或者其他種類的武器.根據"將可變的部分分離出來,單獨封裝"的原則, 需要將武器從角色中分離出來, 單獨封裝.
3. UML圖:
4. 代碼實現:#include <iostream><br />using namespace std;</p><p>// Strategy<br />class Weapon<br />{<br />public:<br /> virtual void Fire() = 0;<br />};</p><p>class WeaponA: public Weapon<br />{<br /> void Fire()<br /> {<br /> cout << "Weapon A is used now!" << endl;<br /> }<br />};</p><p>class WeaponB: public Weapon<br />{<br /> void Fire()<br /> {<br /> cout << "Weapon B is used now!" << endl;<br /> }<br />};</p><p>class WeaponC: public Weapon<br />{<br /> void Fire()<br /> {<br /> cout << "Weapon C is used now!" << endl;<br /> }<br />};</p><p>//Client<br />class Role<br />{<br />public:<br /> void ChangeWeapon(Weapon *wp)<br /> {<br /> m_weapon = wp;<br /> }</p><p> void UseWeapon()<br /> {<br /> m_weapon->Fire();<br /> }</p><p>private:<br /> Weapon *m_weapon;<br />};</p><p>class RoleA: public Role<br />{</p><p>};</p><p>// Main Program<br />int main()<br />{<br /> RoleA *p_ra = new RoleA();<br /> p_ra->ChangeWeapon(new WeaponA());<br /> p_ra->UseWeapon();<br /> p_ra->ChangeWeapon(new WeaponB());<br /> p_ra->UseWeapon();<br /> p_ra->ChangeWeapon(new WeaponC());<br /> p_ra->UseWeapon();<br /> return 0;<br />}
5. 總結: 1. Strategy 模式定義: 定義一系列的演算法,把他們一個個封裝起來,並且使它們可相互替換。Strategy模式使演算法可獨立於使用它的客戶而變化。 2. 體現的設計原則:
- 將可變部分分離出來單獨封裝;
- 多使用組合,少使用繼承;
- 面向介面編程,而不面向實現編程;
3. UML圖: 4. 要點:
- Strategy 基類需要定義出可供Client使用的一些演算法介面;
- 可以隨時根據需要增加 Strategy 而不會影響到Client;
- Client 裡面需要包含對 Strategy 的引用;
- Client 可以隨時更換 Strategy;
6. 理解:
- 繼承的作用有兩個:
->代碼複用;
->讓不同的東西可以具有同種類型;
- 面向介面編程,是指面向基類編程, 利用基類提供的介面編程而不是利用繼承下來的那些具體的子類編程;