行为参数化

℡╲_俬逩灬. 提交于 2020-02-17 17:45:17


行为参数化就是可以帮助你处理??变更的需求的一种软件开发模式。它可以接受不同的新行为作为参数,然后去执行。

1应对不断变化的需求

1.1 筛选绿苹果

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

1.2 筛选重量

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

1.3 塞算重量和颜色

public static List<Apple> filterApples(List<Apple> inventory, String color,
int weight, boolean flag) {
List<Apple> result = new ArrayList<Apple>();
for (Apple apple: inventory){
if ( (flag && apple.getColor().equals(color)) ||
(!flag && apple.getWeight() > weight) ){
result.add(apple);
}
}
return result;
}
这个解决方案再差不过了。如果客户的需求不断增加筛选怎么办?

2 使用行为参数化

2.1 使用行为参数解决问题

编写一个接口,再实现不同筛选条件。再把行为参数穿给filterApples方法。
filterApples 方法的行为取决于你通过 ApplePredicate 对象传递的代码。
public interface ApplePredicate{
boolean test (Apple apple);
}

public class AppleHeavyWeightPredicate implements ApplePredicate{
public boolean test(Apple apple){
return apple.getWeight() > 150;
	}
}

public class AppleGreenColorPredicate implements ApplePredicate{
public boolean test(Apple apple){
return "green".equals(apple.getColor());
	}
}

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

2.2使用匿名内部类可以更加简洁代码

List<Apple> result =
filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));//直接在传递值的时候把匿名内部类传递了。

2.3将类型抽象化

 filterApples 方法还只适用于 Apple 。你还可以将 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 e: list){
if(p.test(e)){
result.add(e);
}
}
return result;
}

现在filter可以接受不同类型的值

List<Apple> redApples =
filter(inventory, (Apple apple) -> "red".equals(apple.getColor()));
List<Integer> evenNumbers =
filter(numbers, (Integer i) -> i % 2 == 0);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!