一、定義
策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。
二、設計原則
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://www.cnblogs.com/dongyang
如若轉載,請保留原文地址。謝謝合作。