一、抛出需求
超市中挑选苹果,挑选条件多样化。
示例:找出绿色并且重量等于150的苹果,找出红色并且重量小于120苹果。
1、苹果类
public class Apple { private String color; private int weight; public Apple(String color, int weight) { this.color = color; this.weight = weight; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } @Override public String toString() { return "color=" + this.color + ",weight=" + this.weight; } }
二、实现方案
采用策略模式,实现数据筛选。
1、查找苹果类
public class FindApple { public static List<Apple> findApple(List<Apple> apples, AppleFilter appleFilter) { List<Apple> list = new ArrayList<>(); for (Apple apple : apples) { if (appleFilter.filter(apple)) { list.add(apple); } } return list; } }
2、实现方法
-
方法一、继承扩展接口实现多个filter
- 绿色并且重量等于150的苹果filter
public class GreenAnd150WeightFilter implements AppleFilter{ @Override public boolean filter(Apple apple) { return ("green".equals(apple.getColor()) && 150 == apple.getWeight()); } }
-
- 红色并且重量小于120苹果 filter
public class RedLess120WeightFilter implements AppleFilter { @Override public boolean filter(Apple apple) { return ("red".equals(apple.getColor()) && 120 > apple.getWeight()); } }
-
- 查询实现与结果
public static void main(String[] args) { List<Apple> appleList = Arrays.asList(new Apple("green", 150), new Apple("red",100)); List<Apple> greenApples = findApple(appleList, new GreenAnd150WeightFilter()); System.out.println(greenApples); List<Apple> redApples = findApple(appleList, new RedLess120WeightFilter()); System.out.println(redApples); }
-
方法二、匿名内部类
public static void main(String[] args) { List<Apple> appleList = Arrays.asList(new Apple("green", 150), new Apple("red",100)); //查找绿色并且重量等于150的苹果 List<Apple> greenApples = findApple(appleList, new AppleFilter() { @Override public boolean filter(Apple apple) { return ("green".equals(apple.getColor()) && 150 == apple.getWeight()); } }); System.out.println(greenApples); //查找红色并且重量小于120苹果 List<Apple> redApples = findApple(appleList, new AppleFilter() { @Override public boolean filter(Apple apple) { return ("red".equals(apple.getColor()) && 120 > apple.getWeight()); } }); System.out.println(redApples); }
3、小结
策略模式的两种实现方法,继承实现多个filter类、匿名内部类,可以方便实现复杂条件的数据筛选,但是在代码上显得有些累赘。