zoukankan      html  css  js  c++  java
  • Android使用的设计模式2——策略模式

    今天讲解一下策略模式,策略模式也是很常用的设计模式,对多种算法或者数据结构选择使用的情况下,经常会使用策略模式来管理这些算法。下面会简单讲解一下策略模式的概念和基本实现。然后结合Android里面的实际应用来说明。

    1、策略模式概念

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

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

    2、策略模式实现

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

    //算法的接口
    public interface PriceStrategy
    {
        public int setPrice(int orgPrice);
    }
    复制代码
    //实现一个接口,打7折商品
    public class sevenPercentStrategy implements PriceStrategy
    {
      public int setPrice(int orgPrice)
        {
              System.out.println("打7折商品");
              return orgPrice*0.7;
        }
    
    }
    
    //实现一个接口,打5折商品
    public class fivePercentStrategy implements PriceStrategy
    {
      public int setPrice(int orgPrice)
        {
              System.out.println("打5折商品");
              return orgPrice*0.5;
        }
    
    }
    复制代码
    复制代码
    //实现一个上下文对象
    public class DstPrice
    {  
        private PriceStrategy mPriceStrategy;  
          
        public void setPriceMode(PriceStrategy priceMode)
        {  
            mPriceStrategy = priceMode;  
        }  
          
        public int ExeCalPrice(int price)
        {  
            mPriceStrategy.SetPrice(price);
        }  
    }  
    复制代码

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

    3、策略模式的理解

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

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

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

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

    4、策略模式优缺点

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

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

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

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

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

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

    5、Android中的应用

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

    参考:

    《研磨设计模式》

    Edited by mythou

    原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3384841.html 

  • 相关阅读:
    使用 Vim 搭建 JavaScript 开发环境
    SpaceVim 语言模块 erlang
    SpaceVim 语言模块 lua
    SpaceVim 语言模块 python
    SpaceVim 语言模块 elixir
    SpaceVim 语言模块 dart
    SpaceVim 语言模块 elm
    如何配置 SpaceVim
    彻底理解浏览器缓存机制
    react-创建react元素
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/3386107.html
Copyright © 2011-2022 走看看