head first 看了一遍,被面试时问我工厂模式,我发现我还是不记得,所以还是认认真真的看一遍吧,上一遍看的太快了,什么都没有记住。这一遍我会写下一些东西帮助自己记忆和理解,例子我也会用C#自己写一遍,所以感觉不错哦。
1:定义
策略模式:定义算法族,分别封装起来,让他们之间可以相互替换。
设计原则: 找到可能变化之处,把它们独立出来。
针对接口编程,而不是针对实现编程
多用组合,少用继承,行为是组合来的,而不是继承来的。
2:代码实现
C#源代码
鸭子飞的接口和动作实现
public interface IFly
{
void fly();
}
public class FlyWithWings : IFly
{
public void fly()
{
Console.WriteLine("I'm flying!!");
}
} public class FlyNoWay : IFly
{
public void fly()
{
Console.WriteLine("I cannot fly!!");
}
}
鸭子叫的接口和实现
public interface IQuack
{
void quack();
}
//有声
public class Quack : IQuack
{
public void quack()
{
Console.WriteLine("Quack");
}
} //无声
public class MuteQuack : IQuack
{
public void quack()
{
Console.WriteLine("<< Silence>>");
}
} //吱吱声
public class Squeak : IQuack
{
public void quack()
{
Console.WriteLine("Squeak");
}
}
鸭子超类
public abstract class Duck
{
public IFly flyBehavior;
public IQuack quackBehavior;
public void performQuack()
{
quackBehavior.quack();
} public void performFly()
{
flyBehavior.fly();
} public void setFly(IFly flybehavior)
{
flyBehavior = flybehavior;
} public void setQuack(IQuack quackbehavior)
{
quackBehavior = quackbehavior;
} public void swim()
{
Console.WriteLine("all can swim");
} public abstract void display(); }
模型鸭子,继承鸭子
public class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyWithWings();
quackBehavior = new Squeak();
}
public override void display()
{
Console.WriteLine("I'm a model duck");
}
}
使用模型鸭子
Duck model = new ModelDuck();
model.performFly();
model.performQuack();
model.setFly(new FlyNoWay());
model.performFly();
model.performQuack();
输出结果