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


 image

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:    }

 

image

 

image

image

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
全站熱搜
創作者介紹
創作者 me1237guy 的頭像
me1237guy

天天向上

me1237guy 發表在 痞客邦 留言(0) 人氣()