设计模式之策略模式

  策略模式,属于行为型设计模式,用于在运行时更改一个类的行为或其算法。

  定义:定义一系列算法类,将每一个算法封装起来,并让它们可以相互转换,让算法独立于使用它的客户而变化。

  问题描述:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护的问题。

  解决方案:将这些算法封装成一个一个的类,任意地替换。

  结构图

  举个栗子:将一个电影票折扣的故事。。。

  电影院中,电影票针对不同的人群有不同的优惠,比如团购票会优惠十元,学生票是八折,儿童票半价和VIP票是四折等,不同的优惠就是不同的策略,我们可以使用策略模式对电影院打折方案进行实现,具体实现方式如下:

  1. 新建一个抽象策略类Discount,它是一个接口,声明了一个打折方法。代码如下:

          

  2. 分别新建上述不同的具体策略类,均实现接口中声明的方法。代码如下:

          

  其他具体策略类相同,略。

  3. 新建一个电影票类MovieTicket,它持有一个对抽象策略类Discount的实例的引用。代码如下:

          

  4. 使用策略模式,实现电影院针对不同人群的打折方案。代码如下:

          

  5. 运行后的效果,如下:

         

  以上可知,如果需要新增新的打折方式,我们无需修改原代码,只要增加一个新的折扣类作为抽象折扣类的子类,实现在抽象折扣类中声明的打折方法,将原有的具体折扣类替换成新的折扣类即可,完全符合开闭原则。

 

  优点

  1. 符合开闭原则;

  2. 提供了管理相关的算法族的方法;

  3. 避免了多重条件选择语句。

  缺点

  1. 会产生很多具体的策略类,增加设计和维护的难度;

  2. 无法同时使用多个策略类,只能使用其中的一种策略。

  3. 使用者必须知道所有的策略类,并自行决定使用哪一个策略类。

 

  适用场景

  1. 当一个系统需要动态地决定在几种算法中选择其中一种使用时;

  2. 当一个对象有很多行为时,可以使用策略模式将这些行为转移到相应的具体策略类里,避免使用难以维护的多重条件选择语句。

 

posted @ 2017-05-05 15:54  chenxkang  阅读(306)  评论(0编辑  收藏  举报