«Обработчик» выкройки? - PullRequest
13 голосов
/ 13 марта 2009

Я сталкивался с шаблоном проектирования, который упоминался как «Шаблон обработчика», но я нигде не могу найти никаких реальных ссылок на этот шаблон. По сути, это всего лишь интерфейс с одним методом, который позволяет легко расширять функциональность на серверной части без перекомпиляции клиентов. Может быть полезно для веб-службы, которая должна обрабатывать различные типы запросов. Вот пример:

public interface IHandler
{
    IDictionary<string, string> Handle(IDictionary<string, string> args);
}

Аргументы обычно включают в себя один ключ, такой как «Действие», со значением, которое указывает имплментации, что делать. Дополнительные аргументы могут быть переданы, чтобы дать impl больше информации. Затем impl возвращает произвольный список аргументов, которые клиент «должен» понять.

Это анти-паттерн или, может быть, другой замаскированный паттерн? Рекомендуется ли этот тип дизайна?

EDIT: Немного больше информации: способ, которым я видел это реализованным, «корневой» обработчик будет действовать как диспетчер для других конкретных обработчиков (может быть?). Корневой обработчик имеет «HandlerResolver», который решает, какой конкретный обработчик должен получить сообщение, основываясь на его содержимом. Может быть, это на самом деле как «диспетчерский» паттерн, хотя я тоже не знаю, действительно ли это паттерн. Я предполагаю, что в корне также может быть шаблон цепочки ответственности, который позволяет вам связать воедино кучу конкретных обработчиков, а затем позволить им решить, какой из них будет обрабатывать.

Ответы [ 6 ]

9 голосов
/ 13 марта 2009

это ООП способ делать замыкания на языках, в которых их нет. у него не было имени шаблона, потому что на функциональных языках это очевидный способ работы. на языках ООП, OTOH, вы должны сделать некоторую работу, так что это кажется именной идиомой. «Обработчик» звучит правильно.

(это не синглтон, кстати)

2 голосов
/ 13 марта 2009

Поскольку в вашем посте было слово «Действие», я склонен полагать, что это может быть частью шаблона Command. Зайдите в вики и поищите «Обработчик» ... возможно, это даст немного больше понимания.

http://en.wikipedia.org/wiki/Command_pattern

2 голосов
/ 13 марта 2009

Я использую его под именем "SingletonRegistry"

См. эту тему

Я использовал его пару раз. Особенно, когда необходимые действия неизвестны заранее (на первых этапах проектирования) или приложение должно поддерживать исключительную гибкость.

Я загружаю словарь из файла или базы данных и создаю один экземпляр класса, который будет обрабатывать запрос под определенным «ключом».

Я нашел этот класс, также ищущий в Интернете это имя.

Похоже, то же самое не так?

1 голос
/ 13 марта 2009

Я думаю, что цель избежать перекомпиляции намного лучше обслуживается 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" });
}
1 голос
/ 13 марта 2009

Я не знаю, действительно ли это рекомендуется, но на самом деле мне приходилось использовать этот тип паттерна в некоторых приложениях MATLAB, которые я написал, чтобы имитировать поведение, подобное ссылкам для объектов (что теперь не нужно в новых версиях) .

По иронии судьбы я фактически назвал функцию "обработчик". Мой объект просто хранил одно поле, содержащее ссылку на дескриптор функции (@handler), а методы были просто обертками, которые вызывали эту функцию. Например, перегруженная функция GET для объекта просто вызовет:

object.handler('get',...input argument list...)

Я не уверен, считается ли это «хорошим» выбором дизайна на других языках. Я выбрал его по необходимости, потому что это был единственный способ создать эталонное поведение в MATLAB (у функции-обработчика был доступ к рабочему пространству инициализированных данных, которые мне не пришлось бы передавать и выводить из вызовы методов). В новейших версиях MATLAB теперь есть класс HANDLE, который может делать это намного чище.

0 голосов
/ 19 января 2015

Я видел классы "Обработчик" в устаревших базах кода, особенно для веб-сервисов. Из того, что я видел, хотя, как правило, они оказываются Адаптером, Фасадом или каким-то подобным шаблоном и заканчивают тем, что их называют Обработчиком, поскольку он обрабатывает запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...