2009-06-12 13 views
40

He comenzado a leer sobre Context design pattern. Esto es lo que he entendido del texto:¿Puedes explicar el patrón de diseño del contexto?

  • tienes un mapa que contiene todas las variables

  • que pasan a su alrededor para quien lo necesite, por lo que no tendrá que enviar todas las variables Parámetros del método

¿Lo "conseguí"?

+0

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

+0

Creo que @ glen-best answer should ser el correcto (63 vs 7 votos). –

Respuesta

18

Un objeto de contexto proporciona acceso a datos y funciones compartidos.

Puede ser un sustituto elegante y flexible para:

  • globales
  • singletons
  • listas de parámetros largos

The ACCU provides a more detailed description.

Si quieres un ejemplo del mundo real del patrón de contexto en Java, consulte el Google Android API's.

Debe tener en cuenta su dependency graph al usar el patrón de contexto. (Esta es la razón por la que KaptajnKold lo llama antipatrón).

Para limitar dependencias innecesarias, utilice contextos diferentes para diferentes propósitos. Mantenga sus contextos lo más simple posible y use composición o herencia para agregar complejidad cuando sea necesario.

64

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.

+2

Me recuerda a la API de Win 32, donde creaste un objeto enorme para una llamada a un solo método y lo pasé como un param, que IMO era un antipatrón. Muchas de las propiedades solo eran relevantes para esa llamada a un único método, es decir, el tamaño de la ventana y la posición de una ventana. Las propiedades de un objeto de contexto no deberían tener una vida tan corta, y deberían ser relevantes y comunes en todo el ámbito actual. Algunas propiedades como la ventana raíz/principal serían información contextual válida. Con suerte, eso ayuda a las personas a pensar y evaluar si están haciendo un mal uso del patrón o no. Ciertamente no es una ciencia exacta. – AaronLS

0

Una clase que utiliza contexto para inicializar. Considere este código

public class BuildTagHandler extends TagHandler { 

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

Utilizará el contexto para construir su clase. En el archivo contexto, no tendrá implementaciones, en su lugar tiene muchos de estos objetos DAO

Puede interpretarlo como un patrón de fachada, o una interfaz enorme que cubre todas las entradas.

Cuestiones relacionadas