出行选择-策略模式

来源:互联网 发布:淘宝怎么换皮肤 编辑:程序博客网 时间:2024/04/25 13:30

首先来看看什么是策略模式?它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。看完定义,自己就知道了它和算法家族有着千丝万缕的关系,让算法独立于使用它的客户而变化,也成为策略模式(对象行为型模式)。

看商场促销模式,有打折,八折,五折,还有返利等等促销方式,每一种方式都可以成为一种策略,我们可以根据环境或者条件的不同来选择不同的策略来完成该项任务(一种任务往往有多种不同的方式供选择),如春季正是旅游的季节,外出到底该乘坐什么出行工具呢?这就可以有多种选择:

只是在附近的公园逛逛的的话可以骑自行车;再远点的话可以乘坐火车;如果想去云南见识见识那美丽的香格里拉的话,为了时间关系,则可以乘坐飞机享受一番。我们则根据自己的需要来选择适合的出行工具,结构图如下:


相关代码如下:

<span style="font-family:SimHei;font-size:18px;"><strong>namespace 出行工具{    class Program    {        static void Main(string[] args)        {            People riding;            riding  = new People(new Bicycle());            riding.Travel();            riding = new People(new Train());            riding.Travel();            riding = new People(new Airplane());            riding.Travel();            Console.Read();        }    }    abstract class means  //乘车工具的抽象    {        public abstract void ride();    }    class Bicycle:means   //对自行车的实现方法    {        public override void ride()        {            Console.WriteLine("乘自行车");        }    }    class Train:means   //对火车的实现方法    {        public override void ride()        {            Console.WriteLine("乘火车");        }    }    class Airplane:means    {        public override void ride()  //对飞机的实现方法        {            Console.WriteLine("乘飞机");        }    }    class People    {       means riding;        public People (means ride)   //告诉要乘坐的工具        {            this.riding = ride;        }        public void Travel()  //自己的方法,调用其算法的方法        {            riding.ride();        }    }}</strong></span>

其实自己举得这个出行的例子和那个商场促销是同一个模型,其实策略模式就是一种定义一系列算法的方法,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

由于他们完成的都是相同的工作,所以可以得到策略模式的一个主要优点就是“开闭原则”的完美支持,在不修改原有系统的基础上可以更换算法或者增加新的算法,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式。

策略模式真的是很神奇啊!相信在以后的学习过程中会遇到与他相似的模式,很是期待啊!

2014-10-14,与状态模式的关系:

如果仔细看会发现其实两个关系除了类图雷同之外,没有什么主要的联系,两者最大的区别就是策略模式通常会控制自己的对象使用什么策略,只是选择其中之一而已。而状态模式则是利用许多不同的状态对象通过对象的周期时间进行来该变自己的状态!所以说他们两者就像双胞胎一样,纵然长得一样,但是每个人都有着每个人的性格和爱好!也就是他们的意图是十分不同的。



10 0