Я «получил» это?
Извините, что не совсем.
Цель объекта контекста - не, чтобы передать множество параметров методам неявно, как средство обхода сильной типизации и инкапсуляции. Цель состоит в том, чтобы хранить данные с областью в общем, но управляемом образом, независимо от протоколов и технологии представления. Данные, хранящиеся в пределах области действия, по своей природе совместно используются, все еще могут быть структурированы и по своей сути отличаются от одноразовых параметров, переданных методу.
Образец контекстного объекта был впервые введен в Core J2EE Patterns 2nd Ed. Часть «Контекст» относится к тому факту, что объект хранит данные в контексте сфера
(например, application/session/request/conversation/flash
).
Цель состоит в том, чтобы отделить, насколько это возможно, данные приложения и логику от классов, связанных с протоколом/презентационной технологией, таких как HttpSession
и HttpRequest
.
шаблон Реализация
Под контекстного объектом, данные, предназначенные для приложения/сеанс/запрос/другой сферы не ставятся непосредственно в ServletContext
/HttpSession
/HttpRequest
/другой класс протокола конкретного. Вместо этого данные сохраняются в классе обертки POJO, который затем находится в ServletRequest
/HttpSession
/HttpRequest
/другом.
Объект контекста may хранит данные на карте, но ему не нужно - он может хранить данные в любой структуре/формате, относящемся к программе.
Приложение может использовать один класс контекстного объекта для каждой области или несколько классов, которые разделяют данные упорядоченным образом, избегая чрезмерного раздувания Класса и способствуя разделению проблем.
Объект контекста используется передними классами презентаций (Views, Front Controllers, Dispatchers). Эти объекты-клиенты презентации вызывают метод contextObject.get для извлечения данных с сохраненными областями и contextObject.put для хранения данных контекстного контекста.
Он не передается в бизнес/интеграционную логику. Он не используется как средство передачи множества параметров в бизнес-объекты, обходя сильную типизацию. Уровни бизнеса и интеграции представлены бизнес-делегатами, приложениями &/или фазами сеанса, которые используют определенные строго типизированные параметры.
шаблон Преимущества
- Тестируемость: Модульные тесты нужно только издеваться простой POJO, а не сложного серверного класса протокола конкретного, например,
ServletContext
или HttpRequest
- Гибкость & переиспользуемости: Ядро приложения работает независимо от тонкого слоя «презентация», специфичного для протокола. Это означает, что приложение может более легко изменять или добавлять протоколы или технологию представления (например, HTML/HTTP/Servlet и WAP/Servlet и XML/SOAP/HTTP/EJB и HTML/HTTP/JSF).
Комментарии
- Является ли историческая картина
- Можно утверждать, что основы для инъекций зависимостей, таких как CDI, Guice, Spring, Seam, & другие дают хранения области видимости, уже реализованного в протоколе -независимый путь. то есть все облачные объекты реализованы как объекты контекста уже, что означает, что разработчик менее вынужден создавать дополнительные объекты контекста. Это не отрицает шаблон - это значит, что среда CDI уже поддерживает шаблон.
- Если неправильно реализована, можно в конечном итоге с «огибают Ginormous Контекст объектов по всему приложению» антипаттерн
Цитирование KaptajnKold: Я думаю, что вы его получили. Однако я также считаю, что это скорее анти-шаблон, которого следует избегать. Смотрите, почему here.
Ваши комментарии относятся к недоисполняемой версии объекта контекста. Сам контекстный объект не является анти-шаблоном.
См. Также: [что такое шаблон проектирования контекстных объектов?] (Http://stackoverflow.com/questions/771983/what-is-context-object-design-pattern) – emallove
Я думаю, что @ glen-best answer должен быть правильным (63 против 7 голосов). –