码迷,mamicode.com
首页 > 其他好文 > 详细

strategy策略模式个人理解

时间:2020-08-27 17:04:55      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:ret   要求   分代   DPoS   过多   nts   使用   不同的   array   

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

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


给定一个数组

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分。。。等等许多判断逻辑,这是我们就可以使用策略模式解决


以上皆属于本人的个人理解,如果有误,希望在评论区指出!

strategy策略模式个人理解

标签:ret   要求   分代   DPoS   过多   nts   使用   不同的   array   

原文地址:https://www.cnblogs.com/flower1360/p/13545347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!