行为参数化


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

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值