策略模式(Strategy Pattern)也稱作政策模式(Policy Pattern)。
定義:Define a family of algorithms ,encapsulat each one ,and make them interchangeable.(定義一組算法,將每個算法封裝起來,并且使他們之間可以互換。)
通用類圖:
       
策略模式的三個角色:
Context封裝角色: 起承上啟下的封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。
Strategy抽象策略角色:定義每個策略或算法必須具有的方法和屬性
ConcreteStrategy具體策略角色:實現抽象策略中的操作,該類含有具體的算法。
優點:
1、算法可以自由切換;
2、避免了使用多重條件判斷;
3、擴展性好;
缺點:
1 、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。 2、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。有時候可以通過把依賴于環境的狀態保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。實現:
 /// <summary>    /// 抽象的策略角色    /// </summary>    public interface Strategy    {        //策略模式的運算法則        public void doSomething();    }    /// <summary>    /// 具體的策略角色1    /// </summary>    public class ConcreteStrategy1 : Strategy    {        public void doSomething()        {        }    }    /// <summary>    /// 具體的策略角色2    /// </summary>    public class ConcreteStrategy2 : Strategy    {        public void doSomething()        {        }    }    public class Context    {        PRivate Strategy strategy = null;        public Context(Strategy _strategy)        {            strategy = _strategy;        }        /// <summary>        /// 封裝后的策略方法        /// </summary>        public void doAnything()        {            strategy.doSomething();        }    }    public class Client    {        public static void main(String[] args)        {            //聲明一個具體的策略            Strategy strategy = new ConcreteStrategy1();            //聲明上下文對象            Context context = new Context(strategy);            //執行封裝后的方法            context.doAnything();        }    } 好了,這一章就寫到這,歡迎大家加入QQ群:280993838 。或者關注我的公眾號:
新聞熱點
疑難解答