首页 > 代码库 > 《Head First 设计模式》之策略模式
《Head First 设计模式》之策略模式
策略模式(Strategy Pattern):定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2.针对接口编辑,而不是针对实现编程。
3.多用组合,少用继承。
UML类图
代码:
/// <summary>
/// abstract base class of Ducks
/// </summary>
public abstract class Duck
{
protected IFlyBehavior flyBehavior;
protected IQuackBehavior quackBehavior;
public IQuackBehavior QuackBehavior
{
get
{
return quackBehavior;
}
set
{
quackBehavior = value;
}
}
public IFlyBehavior FlyBehavoir
{
get
{
return flyBehavior;
}
set
{
flyBehavior = value;
}
}
public abstract object Display();
public object PerformFly()
{
return FlyBehavoir.Fly();
}
public object PerformQuack()
{
return QuackBehavior.Quacking();
}
public string Swim()
{
return "All ducks float, even decoys!";
}
}
/// <summary>
/// MallardDuck.
/// </summary>
public class MallardDuck : Duck
{
public MallardDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public override object Display()
{
return "I‘m a real Mallard duck";
}
}
/// <summary>
/// RedheadDuck
/// </summary>
public class RedheadDuck: Duck
{
public RedheadDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public override object Display()
{
return "I‘m a Redhead duck";
}
}
/// <summary>
/// RubberDuck
/// </summary>
public class RubberDuck : Duck
{
public RubberDuck()
{
quackBehavior = new Squeak();
flyBehavior = new FlyNoWay();
}
public override object Display()
{
return "I‘m a rubber duck";
}
}
/// <summary>
/// ModelDuck Object
/// </summary>
public class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public override object Display()
{
return "I‘m a model duck";
}
}
/// <summary>
/// DecoyDuck
/// </summary>
public class DecoyDuck: Duck
{
public DecoyDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public override object Display()
{
return "I‘m a Decoy duck";
}
}
/// <summary>
/// IFlyBehavior interface for flying behaviors
/// </summary>
public interface IFlyBehavior
{
object Fly();
}
/// <summary>
/// FlyWithWings
/// </summary>
public class FlyNoWay : IFlyBehavior
{
public FlyNoWay()
{}
#region IFlyBehavior Members
public object Fly()
{
return "I can‘t fly.";
}
#endregion
}
/// <summary>
/// FlyWithWings
/// </summary>
public class FlyWithWings : IFlyBehavior
{
public FlyWithWings()
{}
#region IFlyBehavior Members
public object Fly()
{
return "I‘m flying!!";
}
#endregion
}
/// <summary>
/// FlyRocketPowered
/// </summary>
public class FlyRocketPowered : IFlyBehavior
{
#region IFlyBehavior Members
public object Fly()
{
return "I‘m flying with a rocket!";
}
#endregion
}
/// <summary>
/// IQuackBehavior interface for Quacking behaviors
/// </summary>
public interface IQuackBehavior
{
string Quacking();
}
/// <summary>
/// Quack
/// </summary>
public class Quack : IQuackBehavior
{
public string Quacking()
{
return "Quack";
}
}
/// <summary>
/// Squeak
/// </summary>
public class Squeak : IQuackBehavior
{
public string Quacking()
{
return "Squeak";
}
}
/// <summary>
/// MuteQuack
/// </summary>
public class MuteQuack : IQuackBehavior
{
public string Quacking()
{
return "MuteQuack";
}
}
/// <summary>
/// 入口类
/// </summary>
class Program
{
static void Main(string[] args)
{
Duck mallard = new MallardDuck();
Console.WriteLine(mallard.PerformFly());
Console.WriteLine(mallard.PerformQuack());
Duck model = new ModelDuck();
Console.WriteLine(model.PerformFly());
Console.WriteLine(model.PerformQuack());
//动态改变飞行行为
model.FlyBehavoir = new FlyRocketPowered();
Console.WriteLine(model.PerformFly());
Console.ReadKey();
}
}
Strategy.Duck源代码