设计模式系列(一) 策略模式

HeadFirst设计模式这个书买回来,就看了两三成,而且一忙起来就是忘得干干净净,每次都要回头慢慢复习,不但效率很低,而且人的积极性也不高,所以现在开始,从第一个设计模式开始,每学习一个部分,都要记录和总结,并且把自己的体会记录下来,也是对自己编程水平的一个提高,第一个设计模式策略模式

1.1 定义:

策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

1.2 总结在前:

策略模式中用到的设计原则

  • 找出应用程序可能变化的地方,把他们独立出来,不要和那些不需要变化的代码混在一起。
  • 针对接口编程,而不是实现;多用组合,少用继承。

一些要点

  • 知道OO基础(封装继承多态)并不足以让你设计出良好的OO系统。
  • 良好的OO系统必须具备可复用,可扩充,可维护三个特性。

2.1 从鸭子模拟器开始策略模式

需求

  1. 有不同种类的鸭子,绿毛鸭,会飞鸭,橡皮鸭子,火箭鸭子等等
  2. 鸭子具有不同的行为,比如有的鸭子会飞,有的不会,有的会叫有的不会叫
  3. 同一行为的具体表现也不一样,比如有的鸭子呱呱叫,有的鸭子咕咕叫(实现不一样)
  4. 有时候我们需要动态的改变鸭子的行为,比如橡皮鸭不会飞,在运行过程中,橡皮鸭得到了火箭,获得了飞行的能力,即火箭飞。

2.2 思路阐述

根据上面的需求,逐条阐述思路:

  1. 鸭子为基类或者基接口,其他的具体的鸭子都是子类。
  2. 行为即能力,OO中就是接口。鸭子类中,用字段和属性来保存接口。
  3. 接口有不同的子类来实现多态。
  4. 鸭子类中,字段和属性保存的接口实现可以修改,即可以set。

2.3 代码实现

首先定义接口和接口实现

 public interface IflyBehavior
    {
        void fly();
    }
    public interface IQuackBehavior
    {
        void quack();
    }
    //接口实现
    public class FlyWithWings : IflyBehavior
    {
        public void fly()
        {
            Console.WriteLine("fly with wings");
        }
    }
    public class FlyNoWay : IflyBehavior
    {
        public void fly()
        {
            Console.WriteLine(" can not fly");
        }
    }
    public class Quack : IQuackBehavior
    {
        public void quack()
        {
            Console.WriteLine("gua gua gua ");
        }
    }
   

然后就是鸭子基类的设计:

因为有些方法必须子类重写display(),所以为抽象类,必须重写的方法为抽象方法

   public abstract class Duck
    {
        public Duck()
        {
            //基类构造函数
        }
        public IflyBehavior fly;
        public IQuackBehavior quack;

        public abstract void display();

        //具体实现委托给行为类
        public void performFly()
        {
            fly.fly();
        }
        public void performQuack()
        {
            quack.quack();
        }

        //实现动态设定行为
        public void SetFlyBehavior(IflyBehavior ifly)
        {
            fly = ifly;
        }
        public void SetQuackBehavior(IQuackBehavior iquack)
        {
            quack = iquack;
        }

        //基类中的公用方法
        public void swim()
        {
            Console.WriteLine("all ducks float");
        }
    }

具体的某一种鸭子的实现:

  public class SuperDuck : Duck
    {
        public SuperDuck()
        {
            this.fly = new FlyWithWings();
            this.quack = new Quack();
        }
        public override void display()
        {
            Console.WriteLine("this is super duck");
        }
    }

控制台测试:

  static void Main(string[] args)
        {
            Duck d = new SuperDuck();
            d.performFly();
            d.performQuack();
            d.SetFlyBehavior(new FlyNoWay());
            d.performFly();


            Console.ReadKey();

        }

输出结果为:

fly with wings
gua gua gua
can not fly

原文地址:https://www.cnblogs.com/codersun/p/6953909.html