一、定義策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
二、設計原則
1、找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起。2、針對接口編程,而不是針對實現編程。3、多用組合,少用繼承。
三、示例
/// <summary> /// 鴨子類 /// </summary> public abstract class Duck { PRotected IFlyBehavior flyBehavior; protected IQuackBehavior quackBehavior; public Duck() { }
public abstract void Display(); public void PerformFly() { flyBehavior.Fly(); }
public void PerformQuack() { quackBehavior.Quck(); }
public void setFlyBehavior(IFlyBehavior fb) { flyBehavior = fb; }
public void setQuckBehavior(IQuackBehavior qb) { quackBehavior = qb; }
public void Swim() { Console.WriteLine("鴨子全都會游泳!"); } }
/// <summary> /// 飛行行為 /// </summary> public interface IFlyBehavior { void Fly(); }
public class FlyNoWay:IFlyBehavior { public void Fly() { Console.WriteLine("不會飛!"); } }
public class FlyWithWings :IFlyBehavior { public void Fly() { Console.WriteLine("飛飛飛!"); } }
public class FlyRocketPower:IFlyBehavior { public void Fly() { Console.WriteLine("火箭加速飛!"); } }
/// <summary> /// 綠頭鴨 /// </summary> public class MallardDuck:Duck { public MallardDuck() { flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); } public override void Display() { Console.WriteLine("我是一只綠頭鴨!"); } }
/// <summary> /// 模型鴨 /// </summary> public class ModelDuck:Duck { public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new MuteQuack(); } public override void Display() { Console.WriteLine("我是一個模型鴨"); } } static void Main(string[] args) { Duck muteQuack = new MallardDuck();
muteQuack.PerformFly();
Duck model = new ModelDuck(); model.PerformFly(); model.setFlyBehavior(new FlyRocketPower()); model.PerformFly(); Console.ReadLine(); }
源碼下載
轉載請注明來自:閃閃的幸運星
原文地址:http://m.survivalescaperooms.com/dongyang
如若轉載,請保留原文地址。謝謝合作。
新聞熱點
疑難解答