2014-03-25 2 views
0

OO 디자인 구현에 익숙하지 않습니다. OO 설계 요구 사항이 있습니다. 우리가 신발로 신발 한 세트를 가지고 있다고 가정 해 봅시다. 사용자가 크기, 색상, 가격 범위 등과 같은 필터 조건을 입력 한 후 신발 세트를 반환하는 함수를 만들어야합니다. 필터 조건이 향후 확장 될 수 있습니다. 앞으로 어떻게 코드를 수정해야 좋은 기능을 만들 수 있습니까?OO 디자인 필터 단

+0

그럼 신발 세트는 어디에 보관하고 있습니까? 정적 세트로? – GermaineJason

+0

@GermaineJason ArrayList 처럼 신발의 arraylist를 반환하면 충분합니다. – sunraincyq

답변

0

필터는 흔히 Decorator 패턴을 사용하여 구현됩니다. 신발 문제 해결책은 다음과 같을 수 있습니다.

/** 
    * Empty default filter returns the original list. 
    * Maybe this should be an Interface. 
    */ 
public class ShoeFilter { 


    List<Shoe> filter (List<Shoe> shoeList) { 
     // default ist to do nothing. 
     return shoeList; 
    } 
} 


public class SizeFilter extends ShoeFilter { 
    private final ShoeFilter filter; // this can be also part of 
    private final int minSize; 
    private final int maxSize; 

    public SizeFilter (ShoeFilter filter, int minSize, int maxSize) { 
     this.filter = filter; 
     this.minSize = minSize; 
     this.maxSize = maxSize; 
    } 

    public List<Shoe> filter (List<Shoe> list) { 
     List<Shoe> filteredList = filter.filter(list); // apply original filter 

     // filter by size 
    } 
} 


public class ColorFilter extends ShoeFilter { 
    private final ShoeFilter filter; 
    private final Color color; 

    public ColorFilter (ShoeFilter filter, Color color) { 
     this.filter = filter; 
     this.color = color; 
    } 

    public List<Shoe> filter(List<Shoe> list) { 
     List<Shoe> filteredList = filter.filter(list); // apply original filter 

     // filter by color 
    } 
} 


public static void main(String[] args) { 
    List<Shoe> shoes = ...; 
    ShoeFilter emptyFilter = new ShoeFilter(); // can be a singleton 

    ShoeFilter filter = new SizeFilter(new ColorFilter(emptyFilter, Color.Black), 39, 41); 

    List<Shoe> filteredList = filter(shoes); 


} 

Builder을 사용할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나에게 꽤 분명해. 그래서 신발 세트를 만들기 위해 새 필터를 만들어야 할 때마다 기본 필터 클래스를 구현하기 위해 새 필터 클래스를 만들어야합니다. – sunraincyq