Нужна помощь по шаблону стратегии - PullRequest
2 голосов
/ 30 декабря 2010

Существует interface Algorithm

Существует class MathAlgorythm implements Algorithm (returns MathResult, which implements Result)

Существует class ChemitryAlgorythm implements Algorithm (returns ChemitryResult, which implements Result)

Кроме того, существует Context class, который используется для передачи данных в эти алгоритмы.Данные передаются следующим образом:

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

Предположим, я, executeStrategy и получаю обратно return MathAlgorithm.execute(data); Я получаю что-то типа Результат правильно?

Затем я выполняю return ChemitryAlgorithm.execute(data); Снова я получаючто-то Результат

Вопрос: Результатом является интерфейс.Мне нужно получить доступ к конкретной реализации класса как MathResult или ChemistryResult.Другими словами.Как только я получу что-то типа Result, мне нужно копать глубже и знать, какой класс скрывается за интерфейсом

Надеюсь, этот случай не слишком запутан.

Спасибо, что прочитали и ответили

Ответы [ 4 ]

2 голосов
/ 30 декабря 2010

Если вы дадите Result метод, подобный T get(), который должны быть реализованы конкретными реализациями, вам не нужно знать о конкретных реализациях.

0 голосов
/ 30 декабря 2010

Как насчет:

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 голосов
/ 30 декабря 2010

Убедитесь, что ваш интерфейс Result достаточно силен, чтобы удовлетворить всех клиентов.Это ключ, чтобы вы не нарушали полиморфную прозрачность.

Если вам действительно, действительно , REALLY нужно знать конкретный тип, вы можете использовать getClassкакой-то уникальный идентификатор и получатель, или (наиболее предпочтительно) поглощают поведение в операции конкретного класса Результата.

0 голосов
/ 30 декабря 2010

Не уверен, что я понял ваш вопрос, но для того, чтобы узнать конкретный класс экземпляра, вы можете использовать getClass () или альтернативно использовать instanceof, чтобы проверить, является ли это MathResult и т. Д. интерфейс.

...