Подскажите паттерн ООП для задачи Пишу на PHP что-то вроде демона, который не останавливаясь обрабатывает заявки, поступающие из БД.
Вопрос такой: как организовать структуру программы? Я хочу, чтобы в зависимости от типа заявки, к ней применялись различные проверки. Причем проверки должны вызываться на 3-х этапах: заявка поступила, обработана, ушла.
Т.е. должно быть что-то типа событий OnStart, OnProcessed, OnFinish на которые навешены функции проверки, которым поступают на вход параметры заявки. Порядок выполнения функций для меня не важен.
Предполагается возможность настройки администратором системы этих функций, поэтому жестко привязать в коде функции к типам заявок я не могу.
В принципе ООП для меня не самоцель, я могу обойтись и без него.
Для такой задачи можно применить паттерн "Наблюдатель" (Observer). В данном случае можно создать класс "Демон", который будет наблюдать за изменениями в БД и оповещать зарегистрированных наблюдателей (проверки) о новых заявках. Каждая проверка будет являться наблюдателем и подписываться на события "OnStart", "OnProcessed" и "OnFinish" у класса "Демон".
Примерно так может выглядеть структура программы:
class Demon { private $observers = []; public function addObserver(Observer $observer) { $this->observers[] = $observer; } public function processRequest($request) { // Логика обработки заявки // Оповещаем наблюдателей о новой заявке foreach ($this->observers as $observer) { $observer->onStart($request); } // Логика обработки заявки foreach ($this->observers as $observer) { $observer->onProcessed($request); } // Логика обработки заявки foreach ($this->observers as $observer) { $observer->onFinish($request); } } } interface Observer { public function onStart($request); public function onProcessed($request); public function onFinish($request); } class Check1 implements Observer { public function onStart($request) { // Логика проверки на старте } public function onProcessed($request) { // Логика проверки после обработки } public function onFinish($request) { // Логика проверки при завершении } } class Check2 implements Observer { public function onStart($request) { // Логика проверки на старте } public function onProcessed($request) { // Логика проверки после обработки } public function onFinish($request) { // Логика проверки при завершении } } // Использование $demon = new Demon(); $check1 = new Check1(); $check2 = new Check2(); $demon->addObserver($check1); $demon->addObserver($check2); // Получение заявок из БД и обработка $request = // Получение заявки из БД $demon->processRequest($request);
Таким образом, вы сможете динамически подключать и настраивать проверки к различным типам заявок, не изменяя основной логики программы.
Для такой задачи можно применить паттерн "Наблюдатель" (Observer). В данном случае можно создать класс "Демон", который будет наблюдать за изменениями в БД и оповещать зарегистрированных наблюдателей (проверки) о новых заявках. Каждая проверка будет являться наблюдателем и подписываться на события "OnStart", "OnProcessed" и "OnFinish" у класса "Демон".
Примерно так может выглядеть структура программы:
class Demon {private $observers = [];
public function addObserver(Observer $observer) {
$this->observers[] = $observer;
}
public function processRequest($request) {
// Логика обработки заявки
// Оповещаем наблюдателей о новой заявке
foreach ($this->observers as $observer) {
$observer->onStart($request);
}
// Логика обработки заявки
foreach ($this->observers as $observer) {
$observer->onProcessed($request);
}
// Логика обработки заявки
foreach ($this->observers as $observer) {
$observer->onFinish($request);
}
}
}
interface Observer {
public function onStart($request);
public function onProcessed($request);
public function onFinish($request);
}
class Check1 implements Observer {
public function onStart($request) {
// Логика проверки на старте
}
public function onProcessed($request) {
// Логика проверки после обработки
}
public function onFinish($request) {
// Логика проверки при завершении
}
}
class Check2 implements Observer {
public function onStart($request) {
// Логика проверки на старте
}
public function onProcessed($request) {
// Логика проверки после обработки
}
public function onFinish($request) {
// Логика проверки при завершении
}
}
// Использование
$demon = new Demon();
$check1 = new Check1();
$check2 = new Check2();
$demon->addObserver($check1);
$demon->addObserver($check2);
// Получение заявок из БД и обработка
$request = // Получение заявки из БД
$demon->processRequest($request);
Таким образом, вы сможете динамически подключать и настраивать проверки к различным типам заявок, не изменяя основной логики программы.