head first (一):策略模式

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();

输出结果

原文地址:https://www.cnblogs.com/xiaoshuai1992/p/headfirst1.html