分享

设计模式学习笔记(十八)——Strategy策略模式

 skywood 2007-08-06

       这段时间在项目中接触到了Strategy策略模式,所以就学习了一下,做一个总结。

       Strategy策略模式是一种对象行为模式。主要是应对:在软件构建过程中,某些对象使用的算法可能多种多样,经常发生变化。如果在对象内部实现这些算法,将会使对象变得异常复杂,甚至会造成性能上的负担。

       GoF《设计模式》中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。

       Strategy模式的结构图如下:


 

 


      
从图中我们不难看出:Strategy模式实际上就是将算法一一封装起来,如图上的ConcreteStrategyAConcreteStrategyBConcreteStrategyC,但是它们都继承于一个接口,这样在Context调用时就可以以多态的方式来实现对于不用算法的调用。

       Strategy模式的实现如下:

       我们现在来看一个场景:我在下班在回家的路上,可以有这几种选择,走路、骑车、坐车。首先,我们需要把算法抽象出来:

       public interface IStrategy

    {

        void OnTheWay();

}

接下来,我们需要实现走路、骑车和坐车几种方式。

public class WalkStrategy : IStrategy

    {

        public void OnTheWay()

        {

            Console.WriteLine("Walk on the road");

        }

    }

 

    public class RideBickStragtegy : IStrategy

    {

        public void OnTheWay()

        {

            Console.WriteLine("Ride the bicycle on the road");

        }

    }

 

    public class CarStragtegy : IStrategy

    {

        public void OnTheWay()

        {

            Console.WriteLine("Drive the car on the road");

        }

}

 

最后再用客户端代码调用封装的算法接口,实现一个走路回家的场景:

class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Arrive to home");

            IStrategy strategy = new WalkStrategy();

            strategy.OnTheWay();

            Console.Read();

        }

}

运行结果如下;

Arrive to home

Walk on the road

如果我们需要实现其他的方法,只需要在Context改变一下IStrategy所示例化的对象就可以。

 

       Strategy模式的要点:

1Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。

2Strategy模式提供了用条件判断语句以外的另一中选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

3Strategy模式已算法为中心,可以和Factory Method联合使用,在工厂中使用配制文件对变化的点进行动态的配置。这样就使变化放到了运行时。

4、与Template Method相比,Strategy模式的中心跟集中在方法的封装上

posted on 2006-12-15 08:45 KiddLee 阅读(1561) 评论(13)  编辑 收藏 引用 网摘 所属分类: 设计模式

FeedBack:
# 
沙发  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2006-12-15 09:26 zx
浅显易懂  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2006-12-15 13:02 KiddLee
@大师傅似的
@zx
谢谢关注  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2006-12-15 16:13 木野狐
我觉得这个代码不能体现 strategy 模式的特点。  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2006-12-15 19:20 KiddLee
@木野狐
能不能具体些。  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2006-12-16 08:06 十分之七
# re: 设计模式学习笔记(十八)——Strategy策略模式 2006-12-25 20:32 雨杨
如果能把这个程序的对应的结构图画出来就更好了!  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2007-01-17 15:43 高玲玲
目前为止我还没有用过这种模式,怎么总感觉你的代码更像是工厂模式呢?能不能帮我讲一下这两种模式的区别?
谢谢!  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2007-01-18 09:03 KiddLee
@高玲玲
Strategy策略模式是一种行为型模式,主要是应对使用算法的变化
Factory Method模式是一种创建型模式,主要是应对对象创建时的变化  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2007-02-02 17:44 南守拥
从 我使用策略模式的体会来说,我觉得策略模式是把策略的选择和策略的执行逻辑进行分离.从重构的角度来讲,就是把IF..Else的重复进行抽象到一个特定 位置(选择策略),从而避免了重复.在实际的使用过程中我遇到一个问题,就是不同的策略执行需要不同的参数,我现在的做法是把参数用一个接口进行抽象,并 提供一个工厂方法来产生相适应策略类型的参数,担在程序代码上感觉不是很爽.
另外一点体会就是:策略模式=工厂模式+多态....讲多指点...  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2007-02-07 17:42 KiddLee
@南守拥
1、策略模式常常会和工厂模式一起使用,但是就本意来说,我觉得他并不包含工厂模式
2、我觉得策略模式在使用应该是提供同样的接口,也就是你为各个策略提供的参数是一样的,至于参数在策略中是如何操作的,那就交给策略去做。比如说:造汽车的步骤有很多,不同的步骤安排可以形成不同的制造过程,但不能把造汽车和造自行车归为同一类策略
这是我的理解  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2007-02-09 09:43 南守拥
所谓工厂模式+多态;就是在选择一个策略的时候用工厂模式,而返回的实例它们都具有一个公共的接口,在客户代码通过返回的实例调用接口时,表现出来的是多态。哈哈,我这有点强词夺理了。。  回复  更多评论
  
# re: 设计模式学习笔记(十八)——Strategy策略模式 2007-07-20 00:16 dezwen
有点明白,但不是太懂,还需要继续学习。以下是Sina播客Strategy策略模式的相关视频,大家一起参考:
http://you.video.sina.com.cn/b/4736732-1294306030.html  回复  更多评论

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多