Android设计模式—策略模式

转载 2015年07月06日 16:59:08

1、策略模式概念

定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换。策略模式主要是管理一堆有共性的算法,客户端可以根据需要,很快切换这些算法,并且保持可扩展性。

策略模式的本质:分离算法,选择实现。

2、策略模式实现

下面针对策略模式说一个小型的实现例子,个人觉得学习设计模式,最好的方法是看看设计模式概念,然后先看看简单的模式实现的例子。策略模式实现起来,主要需要3部分:抽象接口、实现算法、上下文。

  1. //算法的接口 
  2. public interface PriceStrategy 
  3.     public int setPrice(int orgPrice); 
  1. //实现一个接口,打7折商品 
  2. public class sevenPercentStrategy implements PriceStrategy 
  3. public int setPrice(int orgPrice) 
  4.     { 
  5.           System.out.println("打7折商品"); 
  6.           return orgPrice*0.7; 
  7.     } 
  8.  
  9.  
  10. //实现一个接口,打5折商品 
  11. public class fivePercentStrategy implements PriceStrategy 
  12. public int setPrice(int orgPrice) 
  13.     { 
  14.           System.out.println("打5折商品"); 
  15.           return orgPrice*0.5; 
  16.     } 
  17.  
  1. //实现一个上下文对象 
  2. public class DstPrice 
  3. {   
  4.     private PriceStrategy mPriceStrategy;   
  5.        
  6.     public void setPriceMode(PriceStrategy priceMode) 
  7.     {   
  8.         mPriceStrategy = priceMode;   
  9.     }   
  10.        
  11.     public int ExeCalPrice(int price) 
  12.     {   
  13.         mPriceStrategy.SetPrice(price); 
  14.     }   
  15. }   

上面是一个最简单的策略模式的实现方式,按照功能分为3个部分,定义算法抽象接口,然后根据具体算法实现这些接口,最后需要定义一个上下文对象。这里的上下文对象主要用来切换算法,上下文对象里面也是针对接口编程,具体算法实现被封装了。

3、策略模式的理解

上面实现的只是一种最简单的策略模式的框架,实际应用的时候,我们可以针对不同情况修改上下文对象和具体的算法实现。比如说,可以增加一个抽象类实现作为算法模板。抽象类里面我们可以封装一些公共的方法。这样实现具体的算法的时候,每个算法公共部分就被分离出来。

策略模式的目的是把具体的算法抽离出来,把每个算法独立出来。形成一系列有共同作用的算法组,然后这个算法组里面的算法可以根据实际情况进行相互替换。

策略模式的中心不是如何实现这些算法,而是如何组织和调用这些算法。也就是把我们平时写到一块的算法解耦出来,独立成一个模块,增强程序的扩展性。

策略模式里面的算法通常需要数据执行,我们可以根据实际情况把数据放在不同地方。例如可以放在上下文类里面,然后每个算法都可以使用这些数据。或者对接口封装一个抽象类,在抽象类里面添加数据。这些可以根据实际的情况综合考虑。设计模式里面没有一成不变的万能模式,每种模式都有变化版本,需要根据实际的项目进行变通。

4、策略模式优缺点

定义一系列算法:策略模式的功能就是定义一系列算法,实现让这些算法可以相互替换。所以会为这一系列算法定义公共的接口,以约束一系列算法要实现的功能。如果这一系列算法具有公共功能,可以把策略接口实现成为抽象类,把这些公共功能实现到父类里面,对于这个问题,前面讲了三种处理方法,这里就不罗嗦了。

避免多重条件语句:根据前面的示例会发现,策略模式的一系列策略算法是平等的,可以互换的,写在一起就是通过if-else结构来组织,如果此时具体的算法实现里面又有条件语句,就构成了多重条件语句,使用策略模式能避免这样的多重条件语句。

更好的扩展性:在策略模式中扩展新的策略实现非常容易,只要增加新的策略实现类,然后在选择使用策略的地方选择使用这个新的策略实现就好了。

客户必须了解每种策略的不同:策略模式也有缺点,比如让客户端来选择具体使用哪一个策略,这就可能会让客户需要了解所有的策略,还要了解各种策略的功能和不同,这样才能做出正确的选择,而且这样也暴露了策略的具体实现。

增加了对象数目:由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

只适合扁平的算法结构:策略模式的一系列算法地位是平等的,是可以相互替换的,事实上构成了一个扁平的算法结构,也就是在一个策略接口下,有多个平等的策略算法,就相当于兄弟算法。而且在运行时刻只有一个算法被使用,这就限制了算法使用的层级,使用的时候不能嵌套使用。

5、Android中的应用

下面说说在Android里面的应用。在Android里面策略模式的其中一个典型应用就是Adapter,在我们平时使用的时候,一般情况下我们可能继承BaseAdapter,然后实现不同的View返回,GetView里面实现不同的算法。外部使用的时候也可以根据不同的数据源,切换不同的Adapter。

相关文章推荐

Android设计模式系列—策略模式

Android设计模式系列—策略模式 1、策略模式概念   定义一系列算法,把他们独立封装起来,并且这些算法之间可以相互替换。策略模式主要是管理一堆有共性的算法,客户端可以根据需...

设计模式—策略模式

  • 2015年12月31日 00:08
  • 1.43MB
  • 下载

Head First设计模式学习—模板方法、策略模式

参考资料: 1. head first 设计模式 2. http://blog.csdn.net/hguisu/article/details/7558249/ 在看...
  • zlp1992
  • zlp1992
  • 2016年08月02日 14:44
  • 395

Head First设计模式—策略模式

这是我自己用Objective-c重写Head-First设计模式中第一章策略模式,直接上代码吧: FlyBehavior.h fly协议实现: #import  @protocol FlyB...

设计模式C++实现2—策略模式

本文转自设计模式C++实现(2)—策略模式  软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模...

JAVA设计模式—策略模式(Strategy)

定义:定义一系列算法,将它们一个个封装起来,并且使他们之间可以相互替换。本模式使得算法可以独立于使用它的客户而变化。 类型:对象行为型模式 类图:        策略模式是对...
  • FX_SKY
  • FX_SKY
  • 2013年01月06日 17:31
  • 1046
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android设计模式—策略模式
举报原因:
原因补充:

(最多只允许输入30个字)