Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

设计模式-策略模式

$
0
0

1.策略模式的定义及使用场景

定义:

在软件的开发中常常遇到一个情况,实现某一个功能可以有多种算法或则策略,我们根据实际情况选择不同的算法或则策略来完成该功能。针对这种情况,一种常规的方法是将多种算法写在一个类中,通过if-else等条件判断语句来选择具体的算法,但明显违背了开闭原则和单一责任原则。如果将这些算法或则策略抽象出来,提供一个统一的接口,不同的算法或则策略有不同的实现,这样在程序客户端就可以通过注入不同的实现对象来实现算法或则策略的动态替换,这种模式的扩展性、可维护性更高。
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化

使用场景:

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
  • 需要安全地封装多种同一类型的操作时
  • 出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时

这里写图片描述

2. 策略模式的优缺点

2.1优点

  • 算法可以自由切换
  • 避免使用多重条件判断
  • 扩展性良好

2.2缺点

  • 策略类数量增多
  • 所有的策略类都需要多外暴露

3.注意实现

如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露问题,否则将增大日后的维护成本

4. 策略模式的实现方式

public interface Strategy {
   public void doSomeThing();
}
public class ConcreteStrategy1 implements Strategy {
    @Override
    public void doSomeThing() {
        System.out.println("具体算法1的运算法则...");
    }
}
public class ConcreteStrategy2 implements Strategy {
    @Override
    public void doSomeThing() {
        System.out.println("具体算法2的运算法则...");
    }
}
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void doSomeThing() {
        strategy.doSomeThing();
    }
}
public class Test {
    public static void main(String args[]) {
        Strategy concreteStrategy1 = new ConcreteStrategy1();
        Strategy concretStrategy2 = new ConcreteStrategy2();
        Context context = new Context(concreteStrategy1);
        context.doSomeThing();
        context.setStrategy(concretStrategy2);
        context.doSomeThing();
    }
}

5. 策略模式在Android中的实际应用

在 RecyclerView 还没火起来前,ListView 是一个很重要的组件,我们通常在布局里写个 ListView 组件,然后在代码中 setAdapter,把 View 与 Model 结合的任务交给了 Adapter。

比如 ListView 要显示的子布局是个简单的文字时,我们可以使用 ArrayAdapter :
这里写图片描述
要显示复杂些的布局时,就需要用 BaseAdapter :
这里写图片描述
我们可以看到,当更换 Adapter 的具体实现时,仍然调用的是 ListView.setAdapter(…) 方法,查看 ListView 源码,发现 setAdapter 方法的参数是一个 ListAdapter:
这里写图片描述
继续看 ListAdapter 源码和类结构:
这里写图片描述
可以看到 ListAdapter 是一个接口,ArrayAdapter 和 BaseAdapter 是它的一个实现类。对比文章开始给出的 策略模式 UML 图,可以发现 ListAdapter 就是 strategy 接口,ArrayAdpater 等就是具体的实现类,而在 ListView 中引用的是 接口 ListAdapter,可以证实这就是一个 策略模式 的使用。

作者:junbin1011 发表于2017/2/21 10:11:14 原文链接
阅读:20 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>