Если намерение интерфейса DataSupplier
, чтобы позволить вашему Client
обмениваться и делегировать различные конкретные реализации извлечения данных, тогда да, это можно считать стратегией.Ваш Client
защищен от подробностей (иначе говоря, стратегии), используемых для получения значения, как ожидается при использовании шаблона Стратегия.И тот факт, что ссылка Client
передается в Стратегию, является нормальным и распространенным явлением:
(From the GoF)
"Стратегия и Контекст взаимодействуют для реализации выбранного алгоритма.Контекст может передавать все данные, требуемые алгоритмом, в стратегию при вызове алгоритма. В качестве альтернативы, контекст может передавать себя в качестве аргумента операциям Стратегии. Это позволяет стратегии отозвать контекст в случае необходимости . "
Контекст для вас: Client
.
Теперь, как все говорят, редко встречается решение, использующее только один шаблон.Ваше уведомление, похоже, использует шаблон Observer в качестве еще одного комментария, и это нормально.
Что мне не нравится в том, что вы реализовали, так это то, что ваша стратегия представляет собой чистый интерфейс.Не всегда плохо, но в этом случае с этим обратным вызовом уведомлений интерфейс не гарантирует, что обратный вызов уведомлений произойдет.Интерфейсы гарантируют только подписи методов.Я бы рекомендовал использовать шаблон Template в базовом классе для извлечения стратегий из.
abstract class DataSupplier
{
protected ClientInterface _client;
// ctor takes in context
public DataSupplier(ClientInterface client)
{
_client - client;
}
public void check()
{
int priorValue = 46;
int newValue = OnGetValue();
if (priorValue != newValue)
_client.onValueChanged(newValue)
}
protected abstract int OnCheck();
}
А затем:
class ConcreteDataSupplier : DataSupplier
{
// Check, and notification, are handled by the base. We only need
// to implement the actually data fetching
int OnGetValue()
{
return someValue;
}
}
При таком подходе я знаю, что уведомление будет обработано.Мне не нужно беспокоиться о том, что разработчик забудет об этом в новой стратегии позже.