美文网首页
第二章:通过行为参数化传递代码

第二章:通过行为参数化传递代码

作者: 杨殿生 | 来源:发表于2018-09-20 16:12 被阅读0次

应对不断变化的需求

行为参数化
可以帮助你处理频繁变更的需求的一种软件开发模式,意味着它拿出一段代码块,准备好确不执行他,这个代码块以后被你程序的其他部分调用,再去执行。推迟这块代码块的执行。

筛选苹果

    //筛选绿色苹果
    public static List<Apple> filterGreenApples(List<Apple> inventory){
        List<Apple> result = new ArrayList<>();
        for (Apple apple:inventory){
            if ("green".equals(apple.getColor())){
                result.add(apple);
            }
        }
        return result;
    }

第一个版本

把颜色作为参数

    public static List<Apple> filterGreenApples(List<Apple> inventory,String color){
        List<Apple> result = new ArrayList<>();
        for (Apple apple:inventory){
            if (apple.getColor().equals(color)){
                result.add(apple);
            }
        }
        return result;
    }

如果在加上重量呢

    public static List<Apple> filterHeavyApples(List<Apple> inventory,int weight){
        List<Apple> result = new ArrayList<>();
        for (Apple apple:inventory){
            if (apple.getWeight() > weight){
                result.add(apple);
            }
        }
        return result;
    }

这样其实是复制了大量的代码,那么如果不复制代码怎么写呢,那就需要加入一个flag用来区分是按颜色筛选还是用重量筛选


    public static List<Apple> filterHeavyApples(List<Apple> inventory,String color,int weight,boolean flag){
        List<Apple> result = new ArrayList<>();
        for (Apple apple:inventory){
            if ((flag && apple.getWeight() > weight) ||
                    (!flag && apple.getColor().equals(color))){
                result.add(apple);
            }
        }
        return result;
    }

这么写出来代码很糟糕,并且如果说我要按大小,形状,产品筛选怎么办?在加入组合筛选又该怎么办?

行为参数化

使用策略模式将策略参数化


策略模式类图.png

定义策略接口

public interface ApplePredicate {
    boolean test(Apple apple);
}

分别实现策略

public class AppleGreenColorPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getColor().equals("green");
    }
}
public class AppleHeavyWeightPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 150;
    }
}

改造筛选方法,将策略传入

    public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate predicate){
        List<Apple> result = new ArrayList<>();
        for (Apple apple:inventory){
            if (predicate.test(apple)){
                result.add(apple);
            }
        }
        return result;
    }

这样在调用对应策略就可以了

        filterApples(lists,new AppleHeavyWeightPredicate());
        filterApples(lists,new AppleGreenColorPredicate());

这样使用策略的方案就好很多了,我们可以创建不同的策略来实现筛选。很灵活

注意我们重要的代码都在下面这句话上,我们必须用对象包裹这段代码才能传入到filterApples中,这种做法类似内联传递代码

return apple.getColor().equals("green");

每次我们都要使用策略我们都要创建一个对象,用来实现策略的接口有没有更简单的方式呢?

匿名类

匿名类可以方便的随用随建,但匿名类还是不够好,他占用了很多空间,同时有些时候他也不是很好理解

        filterApples(lists, new ApplePredicate() {
            @Override
            public boolean test(Apple apple) {
                return apple.getColor().equals("red");
            }
        });

使用lambda表达式

 filterApples(lists,(Apple apple) -> apple.getColor().equals("yellow"));

将List类型抽象化

之前我们list都是只适用于list,将list参数化,可以处理各种筛选列表问题

    public interface Predicate<T>{
        boolean test(T t);
    }
    public static <T> List<T> filter(List<T> list,Predicate<T> p){
        List<T> result = new ArrayList<>();
        for (T t: list){
            if (p.test(t)){}{
                result.add(t);
            }
        }
        return result;
    }

调用

        filter(lists,(Apple apple) -> apple.getColor().equals("yellow"));
        filter(numbers,(Integer i) -> i % 2 == 0);

最终这样就是灵活简洁的代码了

其他应用

用Comparator来排序
给苹果按重量排序

lists.sort((Apple a1,Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));

用Runnable执行代码块

new Thread(() -> System.out.println("111"));

相关文章

  • 通过行为参数化传递代码

    基础概念 在软件工程中,一个众所周知的问题是,不管你做什么,用户的需求肯定会变。行为参数化就是可以帮助你处理频繁变...

  • 通过行为参数化传递代码

    行为参数化是可以帮助你处理频繁变更的需求的一种软件开发模式 引言 1.首先我们看下实现从苹果列表中选出所有的绿色的...

  • 第二章:通过行为参数化传递代码

    应对不断变化的需求 行为参数化可以帮助你处理频繁变更的需求的一种软件开发模式,意味着它拿出一段代码块,准备好确不执...

  • 第二章 通过行为参数化传递代码

    1、行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。 2、行为参数化可让...

  • JAVA8(二)

    行为参数化 什么是行为参数化 个人理解:把行为抽象出来进行封装,让代码适应需求的变化,并把行为或代码作为参数传递,...

  • 通过行为参数传递代码

    应对不断变化的需求 目标 在软件工程中一个众所周知的问题就是,不管你做什么,用户的需求肯定会变。比如一位农民第一天...

  • 【Java 8实战笔记】通过行为参数化传递代码

    通过行为参数化传递代码 行为参数化是可以帮助你处理频繁变更的需求的一种软件开发模式。它意味着拿出一个代码块,将它准...

  • Java8 in Action chap2

    通过行为参数化传递代码 1.行为参数化定义: 可以帮助你处理频繁变更的需求的一种软件开发模式。一个方法可以接收不同...

  • 2018-09-25

    java学习笔记(三) 简单的讲讲行为参数化传递代码,这也是Java8实战的第二章 应对不断变化的需求 在软件工程...

  • 行为参数化——使用lambda传递代码

    行为参数化传递代码 行为参数化是为了帮助我们应对不断变化的需求实现快速开发 比如在List 苹果集合中我们需要实...

网友评论

      本文标题:第二章:通过行为参数化传递代码

      本文链接:https://www.haomeiwen.com/subject/fdhnnftx.html