Я изучаю дизайн моделей. Я не уверен, как реализовать шаблон цепочки ответственности в C ++. Я использую инструмент Argo для генерации моего кода из моей диаграммы .
На этой схеме класс Oracle является «клиентом». Метод конструктора Oracle.cpp имеет следующие строки
#include "Oracle.h"Oracle::Oracle(){
Validation v;//Here
}
Здесь я получаю «ошибка:« Проверка »не была объявлена в этой области». Мой вопрос: необходимо ли создавать UML-отношение «зависимость» от Oracle до валидации? Или как я смогу исправить эту ошибку?
Ваш класс Oracle не должен иметь члена типа Validation, а должен быть членом типа Handler.
Это будет, конечно, где-то установлено для проверки (я предполагаю, что это будет первый шаг в цепочке).
Теперь вам все еще нужно построить цепочку, шаги цепочки не должны знать о других шагах.
Теперь есть два варианта, либо класс Oracle может знать, как будет работать цепочка, и сам может строить ее (со всеми возникающими зависимостями).
Или вам нужен класс построителя, чтобы построить цепочку и внедрить ее в экземпляр Oracle (предпочтительно через конструктор).
Второй вариант лучше всего следует философии шаблона CoR (пользователь цепочки не знает о его внутренней работе).
Возможно, ArgoUML добавил эту ссылку для проверки, чтобы иметь возможность создать экземпляр обработчика, но это странно.
Кроме того, я считаю, что метод setNext не принадлежит классу Oracle. Этот класс нуждается в ссылке на первый объект Handler цепочки, но это лучше всего установить из конструктора.
Если он установлен через сеттер, вы должны дать ему правильное имя, например setHanlderChain, чтобы прояснить цель.
успех
В ответ на комментарии:
Элемент цепочки ответственности не знает о самой цепочке, он просто участник.
Итак, где-то вам нужно создать цепочку: создание участников и определение их следующего шага.
Для вашего примера это может выглядеть так (имейте в виду, что прошло много времени с тех пор, как я написал что-то серьезное на C ++, и я предположил, что порядок в вашей диаграмме классов — это порядок выполнения)
Handler buildOracleChain()
{
CalculePR step6 = new CalculePR();
step1.setNext(null);
SolutionKE step5 = new SolutionKE();
step5.setNext(step6);
CalculeSP step4 = new ValcvuleSP();
step4.setNext(step5);
KeyGeneration step3 = new KeyGeneration();
step3.setNext(step4);
Encrypt step2 = new Encrypt();
step2.setNext(step3);
Validation step1 = new Validation();
step1.setNext(step2);
return step1;
}
По второму вопросу у меня нет примера из жизни, но:
Если вы поместите этот метод в класс построителя (например, OracleHandlerChainBuilder), только этот класс должен импортировать все эти шаги, а класс oracle должен импортировать только обработчик.
Там, где вы создаете свой экземпляр Oracle, вы устанавливаете его цепочку (с setNext в вашем случае) на результат метода сборки. Класс, который будет создавать экземпляр класса Oracle, должен импортировать как класс Oracle, так и класс OracleHandlerChainBuilder.
Таким образом, зависимости между классами сводятся к минимуму.
Других решений пока нет …