首先了解策略模式的主要作用:能够把算法进行封装和动态传递;

可能听上去很抽象,我们引入一个方便理解的案例来解释;


给定一个数组

int[] array = {32,12,42,26,-23,0,-2,99,-19,-29};

设计功能要求:输出所有的数字大于0的数字

很简单

      //判断正数
public void filterPositive(int[] array){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(number > 0){
System.out.println(number);
}
}
}

那现在又有其他功能需求,输出所有数字小于0的数字

同样也很简单

      //判断负数
public void filterNegative(int[] array){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(number < 0){
System.out.println(number);
}
}
}

那现在,又需要其他功能,输出所有奇数

      //判断奇数
public void filterOdd(int[] array){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(number%2 == 1){
System.out.println(number);
}
}
}

随着功能的逐渐增多,我们还有输出所有偶数,输出所有大于10的数,输出所有小于-10的数。。。

但是我们观察上面的三段代码,发现他们大部分代码都相同,只有if判断条件不同

//判断正数
if(number > 0){
//判断负数
if(number < 0){
//判断奇数
if(number %2 == 1){

那么我们能否将这些判断的条件作为一个参数传递呢?只需在代码中传入判断方法

    public void filter(int[] array,判断方法){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(判断方法.判断(number)){
System.out.println(number);
}
}
}

这样我们只需要传入不同的判断方法就可以执行不同的判断逻辑

我们可以使用接口来定义判断方法的规范

public interface MyPredicate {
//判断i是否满足条件,满足返回true
public boolean test(int i);
}

在将来使用它时,只需要传入MyPredicate的实现类,调用test方法即可

    public void filter(int[] array,Mypredicate mp){
for (int i = 0; i < arrays.length; i++) {
int number = array[i];
if(mp.test(number)){
System.out.println(number);
}
}
}

1、我们可以手动实现输出大于0的MyPredicate实现类

public class FindPositive implements MyPredicate {
@Override
public boolean test(int i) {
return i > 0;
}
}

调用时只需在调用filter方法的同时,传入一个FindPositive对象即可

但是这样子的话,又会导致类过多的情况,每一个判断条件都需要写一个类,而且这个类也并不是很常用

2、我们可以通过匿名内部类来实现

        MyPredicate myPredicate1 = new MyPredicate() {
@Override
public boolean test(int i) {
return i > 0;
}
};

3、或者在jdk8中可以通过Lambda表达式来更简化

      MyPredicate myPredicate2 = (i) -> {i > 0};
//简化后
MyPredicate myPredicate2 = i -> i > 0;

在将来调用的时候只需传入MyPredicate的实现类对象即可

filter(arrays, myPredicate2)

上面的例子可能比较抽象,下面举一个贴合实际的例子

我们有一个学生对象,有身高,年龄,分数等信息

在我们对学生进行筛选的时候,会有许多条件,身高大于170,身高低于200,年龄大于20,分数大于60分。。。等等许多判断逻辑,这是我们就可以使用策略模式解决

最新文章

  1. 谈谈Lucene和Solr索引存目录
  2. 三、jQuery--jQuery基础--jQuery基础课程--第5章 jQuery 操作DOM元素
  3. URAL 1876 Centipede&#39;s Morning(数学)
  4. c#中struct和class的区别 详细[转]
  5. WebBrowers &amp; HtmlViewers collection
  6. 令人惊奇的gdb和pstack
  7. POJ3259——Wormholes(Bellman-Ford+SPFA)
  8. I.MX6 Linux 自动获取AR1020 event input节点
  9. JavaScript高级程序设计15.pdf
  10. Web学习之自定义标签
  11. 以excel方式输出数据
  12. hibernate 使用sql 查询(setResultTransformer)
  13. photo中的图文混排
  14. jquery.tmplate使用心得
  15. 阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
  16. 【转载】Oracle 中count(1) 、count(*) 和count(列名) 函数的区别
  17. HTTP请求中 request payload 和 formData 区别?
  18. Verilog HDL小练习
  19. sudALSA lib dlmisc.c:236:(snd1_dlobj_cache_get) Cannot open shared library /usr/lib/alsa-lib/libasound_module_pcm_pulse.so
  20. UVa 514 Rails(栈的应用)

热门文章

  1. Linux centos 安装 mysql 5.6
  2. Linux centos 安装 JDK 8
  3. REST设计风格:你写的 RESTful API 到第几层了?
  4. Python的GPU编程实例——近邻表计算
  5. 学习小计: Kaggle Learn Time Series Modeling
  6. RHCS+Nginx及Fence机制实现高可用集群
  7. java IO操作,看完你应该就清晰了。
  8. 性能环境之docker操作指南4(全网最全)
  9. Docker容器编排工具——docker-compose
  10. docker部署rabbitmq集群