如果把相關的演算法全都寫入同一個物件, 然後利用條件式判斷(if or switch)來判斷所要執行的版本
但這樣有一些缺點
1. 程式碼容易變得龐大複雜, 不容易修改
2. 記憶體效能降低, 因為物件包含全部的演算法
3. 擴充新的演算法或是改良版演算法(modified xxx algorithm)必須動到既有的程式碼
4. 不容易多人同時開發
strategy pattern 可以透過繼承, 讓子類別重新定義自己的演算法實作, 下面的例子就是定義
CompressStrategy為抽象類別: 表示壓縮抽象行為, 該類別中成員變數m_iCompress會依照實際需求,
指向不同壓縮方法(CompressZip或是CompressRar);
介面iCompress中定義Compress()和Uncompress(), 繼承的子類別需實作之
1: public abstract class CompressStrategy
2: {3: public iCompress m_iCompress;
4: 5: // 預設建構子
6: public CompressStrategy()
7: { 8: }9: // 設定壓縮方法
10: public CompressStrategy(iCompress cmp)
11: {12: this.m_iCompress = cmp;
13: }14: // 壓縮
15: public void RunCompress()
16: { 17: m_iCompress.Compress(); 18: }19: // 解壓縮
20: public void RunUncompress()
21: { 22: m_iCompress.Uncompress(); 23: } 24: }25: public interface iCompress
26: {27: void Compress();
28: void Uncompress();
29: }Zip子類別
CompressZip繼承iCompress, 所以必須實作Compress()和Uncompress()
1: public class Zip : CompressStrategy
2: {3: public Zip()
4: {5: this.m_iCompress = new CompressZip();
6: } 7: }8: public class CompressZip : iCompress
9: {10: public void Compress()
11: {12: MessageBox.Show("Zip實作Compress");
13: }14: public void Uncompress()
15: {16: MessageBox.Show("Zip實作Uncompress");
17: } 18: }Rar子類別
CompressRar繼承iCompress, 所以必須實作Compress()和Uncompress()
1: public class Rar : CompressStrategy
2: {3: public Rar()
4: {5: this.m_iCompress = new CompressRar();
6: }7: public Rar(string method)
8: {9: if (method == "zip")
10: {11: this.m_iCompress = new CompressZip();
12: }13: else
14: {15: this.m_iCompress = new CompressRar();
16: } 17: } 18: }19: public class CompressRar : iCompress
20: {21: public void Compress()
22: {23: MessageBox.Show("Rar實作Compress");
24: }25: public void Uncompress()
26: {27: MessageBox.Show("Rar實作Uncompress");
28: } 29: }
Zip按鈕
宣告CompressStrategy類別物件 cmp, 以Zip實體化之
1: CompressStrategy cmp = new Zip();
2: cmp.RunCompress(); 3: cmp.RunUncompress();Rar按鈕
宣告CompressStrategy類別物件 cmp, 以Rar實體化之
1: CompressStrategy cmp = new Rar();
2: cmp.RunCompress(); 3: cmp.RunUncompress();Zip/Rar
宣告CompressStrategy類別物件 cmp, 以Rar實體化之, 同時依照使用者傳入字串, 動態切換演算法Zip或Rar
1: string method = comboBox1.Text;
2: CompressStrategy cmp = new Rar(method);
3: cmp.RunCompress(); 4: cmp.RunUncompress();
參考資料:
重新整理Strategy Pattern
全站熱搜




留言列表
