zhh19981104

这是策略模式的学习,策略模式和简单工厂有点容易混淆,希望读者能够分别清楚,

策略是为达到某一目的而采取的手段或方法,策略模式的本质是目标与手段的分离,手段不同而最终达成的目标一致。客户只关心目标而不在意具体的实现方法,实现方法要根据具体的环境因素而变化。

这里依旧是老套路,用实例进行学习了解,因为学习代码多敲多敲才是王道,实践一遍比你看3遍的效率都高那么我这里用作为程序员的我们每天上下班的方式来展开:我们上下班的交通方式有:1、步行  2、骑车(谁叫共享单车如此发达了)、3、地铁  4、开车  接下来就以这四种来进行策略模式的设计,文章结尾会为新手提供一些小实例去练习的。

 

1、首先我先提供一个类图来帮助大家理解,自绘的,美观度希望理解,当然可以选择绘制UML图的软件来进行绘制:

那么接下来我们就通过类图来进行代码的一步一步执行:

2、首先我们声明策略类,父类Strategy,定义为抽象类,方法也为抽象方法,便于子类进行相关的实现。

    public abstract class Strategy
    {
        public abstract void AtWalk();
    }

3、声明几个上班方式的子类继承自父类Strategy

    //  1、汽车 2、步行 3、地铁  

    public class WalkStrategy:Strategy
    {
        public override void AtWalk()
        {
            Console.WriteLine("我是走路去上班的");
        }
    }

    public class SubwayStrategy:Strategy
    {
        public override void AtWalk()
        {
            Console.WriteLine("我是挤地铁的");
        }
    }

    public class CarStrateg : Strategy
    {
        public override void AtWalk()
        {
            Console.WriteLine("小康,开车上下班");
        }
    }

4、写出Context类上下文代码;

    //山下文
    public class Context
    {
        Strategy strategy = null;
        public Context (Strategy strategy)
        {
            this.strategy = strategy;
        }
        //上下文接口
        public void ContextInterface()
        {
            strategy.AtWalk();
        }
    }

5、到这一步,策略模式的核心就已经完成了,接下来就可以对策略模式进行相关的测试了;

    class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context(new WalkStrategy ());
            context.ContextInterface();
            Console.ReadKey();
        }
    }

6、输出如图;

 

7、这里再扩充下,让策略模式和简单工厂进行结合;这里直接就把代码贴出来了,希望读者细细体会,其实也就是对上下文进行了修改而已,让调用的方式更简单了;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //注意,调用的时候被指定调用了,可以自己设置一个限制条件来限制客户的输入,希望读者可以自己去探索

            Context context = new Context("car");
            context.ContextInterface();
            Console.ReadKey();
        }
    }
    public abstract class Strategy
    {
        public abstract void AtWalk();
    }

    //  1、汽车 2、步行 3、地铁  

    public class WalkStrategy : Strategy
    {
        public override void AtWalk()
        {
            Console.WriteLine("我是走路去上班的");
        }
    }
    public class SubwayStrategy : Strategy
    {
        public override void AtWalk()
        {
            Console.WriteLine("我是挤地铁的");
        }
    }
    public class CarStrateg : Strategy
    {
        public override void AtWalk()
        {
            Console.WriteLine("小康,开车上下班");
        }
    }
    //山下文
    public class Context
    {
        Strategy strategy = null;
        public Context(string name)
        {
            switch(name)
            {
                case "car":
                    strategy = new CarStrateg();
                    break;
                case "walk":
                    strategy = new WalkStrategy();
                    break;
                case "subway":
                    strategy = new SubwayStrategy();
                    break;
            }
        }
        //上下文接口
        public void ContextInterface()
        {
            strategy.AtWalk();
        }
    }
}

7、结语:

  策略模式参与者:

   Strategy 策略:定义所支持的算法的公共接口。Context使用这个接口来调用某个Strategy子对象定义的算法。

   Strategy子对象具体策略:实现Strategy接口中的具体算法。

   Context 上下文

    1、 通过一个子对象来对其进行配置;

    2、 维护一个对Strategy对象的引用;

    3、 可定义一个接口来让Strategy访问它的数据。

 

8、END:这里为大家列举出一系列的实例,供大家的学习,加深理解。

1、上班方式

2、空中飞行的东西

3、旅行的出动方式

4、彩票的出奖

5、超市的优惠方式

。。。。。。

相关文章: