Образец "обработчик"?
Я столкнулся с шаблоном проектирования, который упоминался как "шаблон обработчика", но я не могу найти никаких реальных ссылок на этот шаблон в любом месте. Это в основном простой интерфейс с одним методом, который позволяет вам легко расширять функциональность в фоновом режиме, не перекомпилируя клиентов. Может быть полезно для веб-службы, которая должна обрабатывать множество различных типов запросов. Вот пример:
public interface IHandler
{
IDictionary<string, string> Handle(IDictionary<string, string> args);
}
Арги обычно включают в себя один ключ, такой как "Действие" со значением, которое сообщает имплантированию, что делать. Дополнительные аргументы могут быть переданы, чтобы дать им больше информации. Затем impl затем возвращает произвольный список аргументов, которые клиент должен "понять".
Является ли это анти-шаблоном или, возможно, другим шаблоном в маскировке? Рекомендуется ли этот тип дизайна?
EDIT:
Немного больше информации. Как я это видел, обработчик "root" будет действовать как диспетчер для других конкретных обработчиков (может быть?). Корневой обработчик имеет "HandlerResolver", который решает, какой конкретный обработчик должен получить сообщение на основе его содержимого. Возможно, это на самом деле похоже на образец "диспетчера", хотя я не знаю, действительно ли это шаблон. Я предполагаю, что он также может иметь шаблон цепочки ответственности в корне, который позволяет вам объединить кучу конкретных обработчиков, а затем позволить им решить, с кем он будет справляться.
Ответы
Ответ 1
это способ ООП делать замыкания на языках, которые их не имеют. у него не было имени "шаблона", потому что на функциональных языках это очевидный способ работы. на языках ООП, OTOH, вам нужно сделать какую-то работу, поэтому она кажется именованной идиомой. "Обработчик" звучит правильно.
(это не один, BTW)
Ответ 2
Я использую его под именем "SingletonRegistry"
Смотрите этот поток
Я использую его пару раз. Специально, когда действия, которые необходимо предпринять, неизвестны заранее (на первых этапах проектирования) или приложение должно поддерживать экстремальную гибкость.
Я загружаю словарь либо из файла, либо из базы данных, и создаю один экземпляр класса, который будет обрабатывать запрос под определенным "ключом".
Я нашел этот класс , который искал в Интернете для этого имени.
Похоже, это не так?
Ответ 3
Поскольку в вашем посте было слово "Действие", я убежден, что это может быть частью шаблона Command. Проверьте Wiki и найдите "Handler"... возможно, это даст немного больше понимания.
http://en.wikipedia.org/wiki/Command_pattern
Ответ 4
Я не знаю, действительно ли это рекомендовалось, но на самом деле мне пришлось использовать такой тип шаблонов в некоторых приложениях MATLAB, которые я написал, чтобы имитировать ссылочное поведение для объектов (которое теперь бесполезно с более новыми версиями).
По иронии судьбы, я на самом деле называл функцию "обработчик". Мой объект просто сохранил одно поле, содержащее ссылку на дескриптор функции (@handler), и методы были просто оболочками, которые вызывали эту функцию. Например, перегруженная функция GET для объекта просто вызовет:
object.handler('get',...input argument list...)
Я не уверен, что это считается "хорошим" выбором дизайна на других языках. Я выбрал это по необходимости, потому что это был единственный способ, которым я столкнулся, чтобы создать подобное поведение в MATLAB (функция обработчика имела доступ к рабочему пространству инициализированных данных, которое мне не нужно было бы пропускать и выходить из различных вызовы методов). В новейших версиях MATLAB теперь есть класс HANDLE, который может делать это гораздо более простым способом.
Ответ 5
Я думаю, что цель избежать перекомпиляции намного лучше обслуживается COM
влияют на дизайн. Какую дополнительную гибкость вы получите от этого:
IHandler UserHandler = ...;
Dictionary<string,string> result = UserHandler.Handle(
new Dictionary<string, string>{
{ "Action", "AddUser" },
{ "UserName", "Joe Bloggs" },
{ "Age", "23" } });
NewUserId = Int.Parse(result["UserId"]);
над
IUserHandler UserHandler = ...;
AddUserResult result = UserHandler.AddUser(new AddUserArgs {
UserName = "Joe Bloggs",
Age = 23 });
NewUserId = result.UserId;
когда вы можете продлить действия, результаты и аргументы:
IUserHandler UserHandler = ...;
AddUserResult2 result = UserHandler.AddUser(new AddUserArgs2 {
UserName = "Joe Bloggs",
Age = 23,
Password = "xyzzy" });
NewUserId = result.UserId;
SessionId = result.SessionId;
IUserHandler2 UserHandler2 = UserHandler as IUserHandler2;
if (UserHandler2 != null)
{
LoginUserResult loginResult = UserHandler2.LoginUser(new LoginUserArgs {
UserId = NewUserId,
SessionId = SessionId,
Password = "xyzzy" });
}
Ответ 6
Я видел классы "Handler" в устаревших базовых кодах, особенно для веб-сервисов. Из того, что я видел, они обычно оказываются адаптером, фасадом или некоторым подобным шаблоном и в конечном итоге получают вызов обработчика, поскольку он обрабатывает запрос.