如果把相關的演算法全都寫入同一個物件, 然後利用條件式判斷(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
全站熱搜