2009-06-12 2 views
40

Я начал читать о Context design pattern. Вот что я понял из текста:Можете ли вы объяснить шаблон дизайна контекста?

  • у вас есть карта, содержащая все переменные

  • вы передаете его вокруг, чтобы тот, кто нуждается в этом, так что вам не придется отправлять все переменные параметры метода

Я «получил» это?

+0

См. Также: [что такое шаблон проектирования контекстных объектов?] (Http://stackoverflow.com/questions/771983/what-is-context-object-design-pattern) – emallove

+0

Я думаю, что @ glen-best answer должен быть правильным (63 против 7 голосов). –

ответ

18

Объект контекста обеспечивает доступ к общим данным и функциям.

Это может быть элегантной и гибкой заменой:

  • глобалов
  • Singletons
  • длинные списки параметров

The ACCU provides a more detailed description.

Если вы хотите реальный пример шаблона контекста в Java, проверьте Google Android API's.

При использовании шаблона контекста вы должны помнить о своем dependency graph. (Вот почему KaptajnKold называет это анти-шаблоном.)

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

64

Я «получил» это?

Извините, что не совсем.

Цель объекта контекста - не, чтобы передать множество параметров методам неявно, как средство обхода сильной типизации и инкапсуляции. Цель состоит в том, чтобы хранить данные с областью в общем, но управляемом образом, независимо от протоколов и технологии представления. Данные, хранящиеся в пределах области действия, по своей природе совместно используются, все еще могут быть структурированы и по своей сути отличаются от одноразовых параметров, переданных методу.

Образец контекстного объекта был впервые введен в 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.

Ваши комментарии относятся к недоисполняемой версии объекта контекста. Сам контекстный объект не является анти-шаблоном.

+2

Напоминает мне API Win 32, где вы создали огромный объект для одного вызова метода и передали его как параметр, который IMO был анти-шаблоном. Многие свойства были релевантны только для вызова одного метода, то есть размера окна и положения для окна. Свойства объекта контекста не должны быть настолько короткими и должны быть релевантными и общими в текущей области. Некоторые свойства, такие как root/parent window, будут действительной контекстной информацией. Надеюсь, это поможет людям подумать и оценить, злоупотребляют ли они шаблоном или нет. Это, конечно, не точная наука. – AaronLS

0

Класс, использующий контекст для инициализации. Рассмотрим этот код

public class BuildTagHandler extends TagHandler { 

     public BuildTagHandler(ServiceContext context) { // constructor 
      this.tagDAO = context.getTagDAO(); 
      this.buildDAO = context.getBuildDAO(); 
     } 

Вы будете использовать контекст для создания своего класса. В контексте файл, у вас не будет реализаций, вместо этого у вас есть целая часть этих объектов DAO.

Вы можете интерпретировать его как шаблон фасада, или огромный интерфейс охватывает все записи.

Смежные вопросы