목차

첫 번째 시도: 녹색 사과 필터링

List<Apple> inventory = 
Arrays.asList(
 new Apple(80,"green"),
 new Apple(155, "green"),
 new Apple(120, "red")
);
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;
}

// 실행 코드
List<Apple> greenApples = filterApplesByColor(inventory);

두 번째 시도: 색을 파라미터화

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

// 실행 코드
List<Apple> greenApples = filterApplesByColor(inventory, "green");
List<Apple> redApples = filterApplesByColor(inventory, "red");

동작 파라미터화

http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzd3h5MnFXd0QyUlE

사과를 선택하는 다양한 전략

interface ApplePredicate{
    public boolean test(Apple a);
}
static class AppleWeightPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return apple.getWeight() > 150;
    }
}
static class AppleColorPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return "green".equals(apple.getColor());
    }
}

세 번째 시도: 추상적 조건으로 필터링

public static List<Apple> filter(List<Apple> inventory, ApplePredicate p){
    List<Apple> result = new ArrayList<>();
    for(Apple apple : inventory){
        if(p.test(apple)){
            result.add(apple);
        }
    }
    return result;
}
    
// 실행List
<Apple> heavyApples = filter(inventory, new AppleWeightPredicate());
List<Apple> redAndHeavyApples = filter(inventory, new AppleRedAndHeavyPredicate());

http://drive.google.com/uc?export=view&id=0ByLqiEM75qEzOW9BSU5OU1otV3c

불필요한 코드