标签:
同一个问题,总是有许多中解决问题的办法,如何才能让这些办法同时存在而又互不干扰呢?就可以使用策略模式。
策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户端。
意图很明确,对一种问题可以有多种解决方式,而这些解决方式都是互不干扰,但他们又属于同一个家族。
商场促销商品,然而促销商品的策略多种多样,比如买一送一、满100奖50、两件88折等,这些策略都是同属于商品的促销策略家族,但是他们之间的算法是互不干涉的,实际上就是多态的提现。
曾经写过一个工具类,关于使用iReport生成html、excel、pdf、doc的报表的SDK,客户只需要传入数据和想要的报表类型,我就可以为他生成对应的类型的数据报表。这就是一个典型的简单工厂模式,同时也是一个典型的策略模式,所以你会发现,简单工厂模式和策略模式几乎相同,当然,二者的侧重点是完全不一致的。一个客户端类 Client,一个总接口,IExport,声明导出方法export,然后,分别实现报表类型的导出方法。
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
使用策略模式其实直接或间距的消除了条件语句,因为这些行为都被封装在一个个独立的策略具体类当中。
策略模式是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
条件语句的时候,如果发现是业务规则不同的处理,那么确实可以考虑策略模式。
策略模式很常见,而且,个人觉得只要是条件语句的地方几乎都可以理解为再选择合适的策略。
和简单工厂模式结合使用,因为策略的不同是由子类的重写产生,也就是子类的不同导致了策略的不同,那么简单工厂方法模式可以控制对应子类的生成,正好为策略模式派上用场,所以,如果用到了策略模式,请一定要记得是否可以使用简单工厂模式呢?
前面说到策略模式和简单工厂模式的类图基本相同,但是二者的侧重点不一样,前者在于算法的不同实现,后者不同对象的实例化,况且,仔细看策略模式你会发现,实际上策略模式可以包含简单工厂模式。
标签:
原文地址:http://my.oschina.net/heweipo/blog/424091