Окно диалога - Реализация образца "Диалоговое окно"

ОГЛАВЛЕНИЕ

Реализация образца "Диалоговое окно"

Теперь, когда Вы знаете клиентский код, давайте рассмотрим полную реализацию образца "Диалоговое окно". Фабрика контроллера - очень простой шаблон класса. Все, что она делает, это прием списка обобщенных параметров и сохранение его через void-указатели. Только определенный клиентом контроллер знает, чем фактически является класс, размещенный в списке параметров, и только он выполняет приведение (см. конструктор EditorCtrl).

Код, общий для всех фабрик контроллеров изолирован в классе CtrlFactory от которого наследует фактический шаблон. Шаблон переопределяет метод MakeController, чтобы создать новый контроллер для класса ActualCtrl, определенного клиентом. Обратите внимание, что метод возвращает ActualCtrl как указатель на его базовый класс DlgController, и это - все то, что видит остальная часть реализации.

class CtrlFactory
{
public:
CtrlFactory (void *argList) : _argList (argList) {}
void *GetArgList () { return _argList; }
virtual DlgController * MakeController (HWND hwndDlg) = 0;

private:
void *_argList;
};

template <class actualCtrl, class ActualArgList>
class ControllerFactory : public CtrlFactory
{
public:
ControllerFactory (void *argList) : CtrlFactory (argList) {}
DlgController * MakeController (HWND hwndDlg)
{
return new ActualCtrl (hwndDlg, (ActualArgList *) GetArgList ());
}
};