L'ho "capito"?
Mi dispiace dirlo, non proprio.
L'obiettivo di Context Object è non di passare un sacco di parametri ai metodi implicitamente, come un mezzo per by-passando tipizzazione forte e l'incapsulamento. L'obiettivo è archiviare i dati con scope in modo generale, ma gestito, indipendentemente dai protocolli e dalla tecnologia di presentazione. I dati memorizzati all'interno di un ambito sono per natura condivisi, possono essere ancora strutturati e sono intrinsecamente diversi dai parametri one-off passati a un metodo.
Il modello oggetto contesto è stato introdotto per la prima volta nel Core J2EE Patterns 2nd Ed. La parte "Contesto" fa riferimento al fatto che l'oggetto contiene dati nel contesto di uno scope
(come application/session/request/conversation/flash
).
Lo scopo è quello di separare, per quanto possibile, i dati dell'applicazione e la logica dalle classi specifiche di protocollo/presentazione-tecnologia come HttpSession
e HttpRequest
.
modello di attuazione
In Context Object, i dati destinati ad essere applicati/sessione/richiesta/altro campo di applicazione non è messo direttamente in ServletContext
/HttpSession
/HttpRequest
/altra classe specifiche del protocollo. Invece, i dati sono memorizzati in una classe wrapper POJO, che quindi risiede nello ServletRequest
/HttpSession
/HttpRequest
/altro.
L'oggetto contesto può memorizzare i dati in una mappa, ma non è necessario: è possibile memorizzare i dati in qualsiasi struttura/formato rilevante per il programma.
Un'applicazione può utilizzare una classe Context Object per ambito o più classi che suddividono i dati in modo ordinato, evitando un eccessivo bloat di classe e promuovendo la separazione dei problemi.
L'oggetto di contesto viene utilizzato dalle classi di presentazione in primo piano (Visualizzazioni, Front Controller, Dispatcher). Questi oggetti client di presentazione chiamano contextObject.get per recuperare i dati dell'ambito memorizzati e contextObject.put per archiviare i dati del contesto con ambito.
Non viene passato alla logica business/integrazione. Non è usato come mezzo per passare una moltitudine di parametri in oggetti business, passando da una forte digitazione. I livelli di business e di integrazione sono affiancati da delegati aziendali, servizi applicativi &/o facciate di sessione che utilizzano specifici parametri fortemente tipizzati.
Motivo Vantaggi
- Testability: test unitari devono solo deridere un semplice POJO, piuttosto che una classe di server specifico complesso-protocollo come
ServletContext
o HttpRequest
- Flessibilità & Riutilizzabilità: Il nucleo dell'applicazione funziona indipendentemente dal livello di classi "presentazione" specifico del protocollo. Ciò significa che un'applicazione può modificare o aggiungere più facilmente protocolli o tecnologie di presentazione (ad esempio HTML/HTTP/Servlet e WAP/Servlet e XML/SOAP/HTTP/EJB e HTML/HTTP/JSF).
Commenti
- è un modello storico
- si potrebbe sostenere che i quadri iniezione di dipendenza, come CDI, Guice, Primavera, Seam, altri & dare stoccaggio portata già implementato in un protocollo modo indipendente Ad esempio, tutti gli ambiti sono già implementati come oggetti di contesto, il che significa che lo sviluppatore è meno costretto a creare oggetti di contesto aggiuntivi. Ciò non annulla lo schema: significa che il framework CDI supporta già il pattern.
- Se correttamente implementato, si può finire con il "passare intorno Ginormous Contesto Objects in tutta l'applicazione" antipattern
Citando KaptajnKold: Penso che avete ottenuto. Tuttavia, penso anche che sia più un anti-modello da evitare. Scopri perché here.
I commenti si riferiscono alla versione non corretta di Oggetto contesto. Contesto L'oggetto stesso non è un anti-modello.
Vedere anche: [qual è il modello di progettazione oggetto del contesto?] (Http://stackoverflow.com/questions/771983/what-is-context-object-design-pattern) – emallove
Penso che la risposta alla glen-migliore dovrebbe essere quello giusto (63 vs 7 voti). –