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();
输出结果