2017-12-06 11 views
0

는이상태 패턴의 잘못된 사용?

interface FilterStrategy { 
    public void filter(); 
} 

class OldProductsStrategy implements FilterStrategy { 
    public filter(); 
} 

class NewProductsStrategy implements FilterStrategy { 
    public filter(); 
} 

class ProductsFilterStrategy { 
    public getFilter(a) { 
    if(a) { 
    return new NewProductsStrategy(); 
    } else { 
    return new OldProductsStrategy(); 
    } 
} 

class Client { 
    new ProductsFilterStrategy().getFilter(true).filter(); 
} 

는 전략 패턴의 전략 구현 부분의 선택을 위임 된 전략의 잘못된 사용을 다음인가?

+0

'getFilter'에 전달할 값이 런타임에 결정되면 - 그걸로 어떤 문제도 볼 수 없습니다. 그렇지 않은 경우 잠재적으로 약간 중복 될 수 있습니다. – Bilkokuya

답변

1

사용상 좋습니다. 그러나 기술적으로 다른 인스턴스를 생성하는 클래스는 하나의 팩토리입니다. 전략 패턴의 일부가 아닙니다.

0

패턴을 채택하는 방법은 귀하에게 달려 있습니다. 그러나 패턴을 채택하고 구현할 때 패턴을 염두에 두는 데는 많은 이점이 있습니다. 당신이하는 컨텍스트 클래스가 있어야 패턴 정의를 바탕으로

:

  1. 는 ConcreteStrategy 객체
  2. 로 구성되어 전략에 액세스 할 수 있도록하는 인터페이스를 정의 할 수있는 전략 객체
  3. 에 대한 참조를 유지 그것의 데이터.

그래서 당신이 제공 할 수있는이 같은 사용은 :

context = new Context(new ConcreteStrategyA()); 
    context.ContextInterface(); 

    context = new Context(new ConcreteStrategyB()); 
    context.ContextInterface(); 

    context = new Context(new ConcreteStrategyC()); 
    context.ContextInterface(); 

당신은 공장 또는 IoC 컨테이너를 사용하여 전략 인스턴스를 제공 할 수 있습니다. 컨텍스트의 일부가 아닙니다.

0

예제는 정적 팩토리를 통해 전략 계층 구조를 제공하는 유효한 코드입니다. 어느 쪽이 좋아 보인다. 을 나타내는 클래스 만 위의 코드에서 전략 패턴의 컨텍스트가 누락되었습니다.

전략에 stateless가있는 경우 매번 새로운 전략을 작성해야하는 이유가 풀에서 공유 될 수 있습니다.