2010-12-29 7 views
2

interface Algorithm전략 패턴 도움 필요

(returns MathResult, which implements Result

존재 class ChemitryAlgorythm implements Algorithm

또한 이러한 Algos로 데이터를 전달하는 데 사용되는 Context class가 있습니다. 데이터는 다음과 같은 방식으로 전달됩니다.

public Result executeStrategy(Data data) { 
    return algo.execute(data); 
} 

내가 executeStrategy라고 가정하고 를 얻습니다. return MathAlgorithm.execute(data); 결과 유형이 올바르지 않습니까?

다음 return ChemitryAlgorithm.execute(data); 실행 다시 뭔가가 결과

질문 : 결과는 인터페이스입니다. MathResult 또는 ChemistryResult와 같은 구체적인 클래스 구현에 액세스해야합니다. 다른 말로. 일단 내가 결과 형식의 것을 얻으면, 나는 더 깊게 파고 들고 어떤 클래스가 인터페이스 뒤에 숨어 있는지 알아야한다.

나는이 혼란이 너무 혼란스럽지 않기를 바란다.

읽고 응답 해 주셔서 감사합니다.
+2

이가 함께 길'algorithm'에 의해입니다 '나'. – BalusC

+0

전략은 대개 서로 다른 알고리즘을 사용하여 (본질적으로) 동일한 결과를 얻는 경우에 사용됩니다. 더 좋은 예는 SteepestDescents 또는 ConjugateGradients 인 다양한 전략을 가진 Optimiser입니다. 수학과 화학을 대안 Stratgeies로 ​​보는 것은 어렵습니다. (이것이 필요한 모든 것이라면 결과에 전략 클래스 필드가있을 수 있습니다.) –

+0

정확합니다.여기에있는 도전 과제는 동일한 우산 아래 다른 그룹 결과를 그룹화하는 것입니다. 수학과 화학이 같은 대상을 반환한다면 아무런 문제가 없었을 것입니다. 나는 지금 Optimizer를 google 할 것이다 – JAM

답변

2

응답 주셔서 감사합니다.

+0

고맙다. 잘 작동합니다. – JAM

0

확실하지 않은 경우 귀하의 질문을 이해하지만 getClass() 또는 대안으로 instanceof를 사용하여 MathResult인지 확인할 수있는 인스턴스의 구체적인 클래스를 알 수 있는지 확인하십시오. 결과 인터페이스.

0

Result 인터페이스가 모든 클라이언트를 만족시킬만큼 충분히 강해야합니다. 그것이 다형성 투명성을 손상시키지 않도록하는 열쇠입니다.

당신이 정말로, 정말가 정말 필요가 구체적인 유형을 알고 있다면, 당신은 getClass 고유 ID의 어떤 종류와 게터, 또는 (가장 바람직)를 사용하여 A의 동작으로 동작을 흡수 할 수 있습니다 concrete 결과 클래스.

0

방법에 대해 :

interface Algorithm<R extends Result, D extends Data> { 
    T execute data(D data); 
} 

다음 MathAlgorithm 구현은 다음과 같을 것이다 :

class MathAlgorithm implements Algorithm<MathResult, MathData> { 
    public MathResult execute(MathData data) { 
    // do whatever 
    return <instance of MathResult>; 
    } 
} 

사용 :

MathResult mathResult = new MathAlgorithm().execute(someMathData); 
+0

예. 감사합니다. 문제는 결과를 얻을 때 MathResult 또는 ChemistryResult를 얻고 싶지 않다는 것입니다. 나는 가능한 한 Result만을 원한다. 일단 내가 얻으면, 나는 그것이 어떤 종류의 결과인지보고 싶고 거기서부터 가고 싶습니다. – JAM