Did I "get" it?
Lamentablemente, no del todo.
El objetivo del objeto de contexto es no para pasar muchos parámetros a los métodos de manera implícita, como un medio para evitar el tipado fuerte y el encapsulado. El objetivo es almacenar los datos del ámbito de forma general, pero administrada, independientemente de los protocolos y la tecnología de presentación. Los datos almacenados dentro de un alcance son, por naturaleza, compartidos, pueden estructurarse y son intrínsecamente diferentes de los parámetros excepcionales que se pasan a un método.
El patrón de objeto de contexto se introdujo por primera vez en el Core J2EE Patterns 2nd Ed. La parte 'Contexto' se refiere al hecho de que el Objeto contiene datos en el Contexto de un alcance
(como application/session/request/conversation/flash
).
Su propósito es desacoplar, en la medida de lo posible, los datos de la aplicación y la lógica de las clases específicas de protocolo/presentación-tecnología como HttpSession
y HttpRequest
.
Patrón Implementación
Bajo Contexto de objetos, datos destinados a la aplicación/sesión/petición/otro ámbito de aplicación no se pone directamente en la clase específica del protocolo ServletContext
/HttpSession
/HttpRequest
/otro. En cambio, los datos se almacenan en una clase de contenedor POJO, que luego se encuentra en el ServletRequest
/HttpSession
/HttpRequest
/other.
El objeto de contexto puede almacenar los datos en un mapa, pero no es necesario - puede almacenar los datos en cualquier estructura/formato relevante para el programa.
Una aplicación puede usar una clase de objeto de contexto por ámbito, o varias clases que dividen los datos de forma ordenada, evitando la excesiva obstrucción de clases y promoviendo la separación de preocupaciones.
El Objeto de Contexto es utilizado por las clases de presentación más avanzadas (Vistas, Controladores Frontales, Despachadores). Estos objetos de cliente de presentación llaman a contextObject.get para recuperar datos de ámbito almacenados y contextObject.put para almacenar datos de contexto de ámbito.
No se pasa a la lógica de negocios/integración. No se usa como un medio para pasar una multitud de parámetros en objetos comerciales, evitando el tipado fuerte. Los Niveles de negocios e integración están liderados por delegados comerciales, Servicios de aplicaciones &/o Fachadas de sesión que usan parámetros específicos de tipo fuerte.
Pattern Beneficios
- Testabilidad: Las pruebas unitarias sólo necesitan burlarse un POJO simple, en lugar de una clase de servidor complejo de protocolo específico, como
ServletContext
o HttpRequest
- Flexibilidad & Reutilización: El núcleo de la aplicación funciona independientemente de la capa de clases de 'presentación' específica de protocolo delgada. Esto significa que una aplicación puede cambiar o agregar protocolos o tecnología de presentación más fácilmente (por ejemplo, HTML/HTTP/Servlet y WAP/Servlet y XML/SOAP/HTTP/EJB y HTML/HTTP/JSF).
Comentarios
- es un patrón histórico
- Se podría argumentar que los marcos de inyección de dependencia, tales como CDI, Guice, Primavera, costura, otros & dar de almacenamiento alcance ya implementada en un protocolo -independiente es decir, que todos los ámbitos ya están implementados como objetos de contexto, lo que significa que el desarrollador está menos obligado a crear objetos de contexto adicionales. Eso no niega el patrón, significa que el marco CDI ya admite el patrón.
- Si se aplica de forma incorrecta, se puede acabar con el "pase alrededor Ginormous objetos de contexto en toda la aplicación" anti patrón
Citando KaptajnKold: Creo que lo tienes. Sin embargo, también creo que es más un anti patrón que evitar. Vea por qué here.
Sus comentarios se refieren a la versión mal implementada de Context Object. Contexto Object en sí mismo no es un antipatrón.
Vea también: [¿cuál es el patrón de diseño de objeto de contexto?] (Http://stackoverflow.com/questions/771983/what-is-context-object-design-pattern) – emallove
Creo que @ glen-best answer should ser el correcto (63 vs 7 votos). –