2016-08-26 6 views
1

나는 전략 패턴 구현 해요 : 이제자바, 전략 패턴, 제네릭 및 수익 형

public interface Stuff<T> { 
    T getStuff(); 
} 

public class IntegerStuff implements Stuff<Integer> { 
    public Integer getStuff() { .. } 
} 

public class StringStuff implements Stuff<String> { 
    public String getStuff() { .. } 
} 

을, 나는 전략을 설정하는 "컨텍스트"를 사용하고, 전략 방법을 실행하려면 :

public class Context() { 
    private Stuff stuff; 
    public setStrategy(Stuff stuff) { this.stuff = stuff; } 

    public Object doStuff() { // ARGH! 
     return stuff.getStuff() 
    } 
} 

generic을 사용하면 어떻게 Context 클래스의 doStuff() 메서드 유형을 사용 전략과 동일한 유형으로 만들 수 있습니까?

+1

전략 패턴은 블랙 박스의 동작의 종류를 할 수 있습니다. 당신은 정의 된 입력과 정의 된 출력을 가지지 만 그 사이에 일어난 일은 전략을 결정합니다 (이것은 교환 가능해야합니다). 당신이 당신의 방법의 결과를 바꾸기를 원한다면 나는 전략 패턴이 올바른 선택이 아니라고 생각한다. – CRC

+0

@CRC, 맞아, 네가 맞다고 생각해, 반환 형식을 바꾸면 "계약"이 변할지도 모른다. – Luciano

+1

어쩌면이게 다른 방법으로 해결 될지도 몰라. : 이걸로 무엇을 하려니? – Fildor

답변

3

당신은뿐만 아니라 Context을 매개 변수화 할 것 :

public class Context<T> { 
    private Stuff<T> stuff; 
    public setStrategy(Stuff<T> stuff) { this.stuff = stuff; } 

    public T doStuff() { // ARGH! 
     return stuff.getStuff() 
    } 
} 
+0

이 경우 (전략 패턴)이 작동하지 않습니다. 전략 클래스 유형으로 컨텍스트를 만들 필요가 없습니다! 컨텍스트 c = 새 컨텍스트 <>(); ' – Luciano

+0

@ 루시아 노 : "이게 효과가 없다"는 것은 무엇을 의미합니까? 왜 작동하지 않습니까? –

+0

이 경우 출력 유형을 알 수 없습니다. 따라서 반환 값은 객체이지만 다른 것은 없음을 확인할 수 있습니다. 따라서 출력을 제한 할 것인지 또는 반환 형식으로 Object를 사용할 것인지 결정할 수 있습니다. – CRC