У меня есть следующая диаграмма UML. CurlRequestHandler
и KernelRequestHandler
являются одновременно реализацией RequestHandlerInterface
. Обработчики запросов несут ответственность за обработку определенного объекта Request
, все они возвратят тот же объектResponse
.Шаблон стратегии или шаблон цепочки ответственности для определения правильного действия
+------------------------+ +-------------------------+
| CurlRequestHandler | | KernelRequestHandler |
|------------------------| |-------------------------|
| | | |
| - handleRequest(Request) | - handleRequest(Request)|
| | | |
| | | |
| | | |
+------------------------+ +-------------------------+
+
| +
| |
| +---------------------------+ |
| | RequestHandlerInterface | | +---------------+
+----> |---------------------------| <-----+ | |
| | | |
| - handleRequest(Request) | | CLIENT |
| | | |
| | +---------------+
| |
| |
+---------------------------+
Теперь, чтобы определить, какой обработчик нужно использовать, я следующее, если заявление в client
:
if ($mode == "kernel") {
$handler = new KernelRequestHandler();
} else {
$handler = new CurlRequestHandler();
}
$response = $handler->handleRequest($request);
Теперь проблема, когда мне нужно, чтобы добавить новый обработчик, Мне нужно изменить инструкцию if
. Я заглянул в шаблон дизайна Chain of Responsibility
, и это, похоже, лучше справляется с этим, но я не уверен.
Какой шаблон дизайна был бы лучшим подходом для этого?
Штеффен
Кажется мне, как вы хотите перестарайтесь шаблоны проектирования. Нет ничего хуже, имо, чем излишне сложный код. Создание экземпляра динамически с использованием строки в качестве имени класса позволит вам инициализировать всю содержащуюся строку без изменения содержимого i/else, если предположить, что класс существует. '$ className = 'реализация'; $ instance = new $ className(); ' – Virus721
Вам просто нужен простой [заводской шаблон] (http://stackoverflow.com/questions/2079902/factory-abstract-factory-and-factory-method) –
Ой, так как при добавлении нового, если это стало проблемой? Однако вы можете просто выполнить команду if (class_exists ($ className = ucfirst ($ mode). RequestHandler, false)) {$ handler = new $ className(); } else {$ handler = new DefaultRequestHandler(); } ', и это позволит избежать многократного использования ifs. – Twisted1919