Chain of Responsibility (padrón de deseño): Diferenzas entre revisións

Contido eliminado Contido engadido
m Bot: Substitución da categoría "Patróns de deseño" pola categoría "Padróns de deseño"; cambios estética
m Arranxos varios, replaced: patrón → padrón (8)
Liña 1:
'''Cadea de Responsabilidade''' (en [[lingua inglesa|inglés]] "Chain of Responsability") é un [[patrónpadrón de deseño]] que permite xestionar unha petición a máis de un obxecto mediante o encadeamento de receptores, que se pasan a petición ó longo da cadea ata que un dos obxectos manipula dita petición.
 
Un patrónpadrón de cadea de responsabilidade é a miúdo utilizado no contexto de interfaces gráficas de usuario onde un obxecto pode conter varios outros obxectos. Segundo o ambiente de ventás xera eventos, os obxectos ou os manexan ou los pasan.
 
== Motivación ==
* Supoñamos un servizo de axuda sensible ó contexto para unha interface gráfica de usuario. O usuario pode obter información de axuda en calquera parte da mesma simplemente pulsando co rato sobre ela. A axuda proporcionada depende da parte da interface que se selecciona así como do seu contexto. Se non existe información de axuda específica para esa parte da interface o sistema de axuda debería mostrar un mensaxe de axuda más xeral sobre o contexto inmediato.
* Se o obxecto "actual" seleccionado da cadea ten información específica debe presentala e manexar a petición; en caso contrario, debe enviar a petición (mensaxe) ó seu sucesor na cadea de responsabilidade.
* O problema é que o obxecto que en última instancia proporciona a axuda non coñece explicitamente o obxecto que inicia a petición de axuda. Necesitamos un modo de desacoplar o botón que da lugar á petición de axuda dos obxectos que poderían proporcionar dita información. O patrónpadrón Cadea de Responsabilidade define como facer isto: a idea é desacoplar ós emisores e ós receptores dándolle a varios obxectos a posibilidade de tratar unha petición. Esta petición pasará a través da cadea de obxectos ata que sexa procesada por un deles.
 
[[Ficheiro:Motivacion2GL.png|centro|500px|]]
 
Se un usuario solicita axuda sobre un botón denominado "Imprimir". O botón encóntrase nunha instancia de DialogoDeImpresion. O seguinte diagrama de interacción mostra como a petición de axuda se reenvía a través da cadea.
 
[[Ficheiro:Motivacion3GL.jpg|centro|500px|]]
 
Nese caso a petición non é procesada nin por unBotonDeImpresion nin por unDialogoDeImpresion; detense en unhaAplicacion, quen pode procesala ou ignorala. O cliente que deu orixe á petición non ten ningunha referencia directa ó obxecto que finalmente a satisfai.
Liña 18:
Para reenviar a petición ó longo da cadea e para garantir que os receptores permanecen implícitos, cada obxecto da cadea comparte unha interface común para procesar peticións e para acceder ó seu sucesor na cadea. Por exemplo, neste sistema de axuda podería definirse unha clase ManexadorDeAxuda.
 
[[Ficheiro:Motivacion1GL.jpg|centro|500px|]]
 
== Aplicabilidade ==
Liña 30:
== Participantes ==
* '''Manexador''' : A interface que define o método usado para pasar unha mensaxe ó seguinte handler. A mensaxe é normalmente unha chamada a un método. Ademais, frecuentemente define tamén o enlace ó sucesor na cadea.
 
* '''Manexador concreto''' : Unha clase que implementa a interface Handler e mantén unha referencia ó seguinteHandler. Esta referencia pode ser asignada no construtor da clase ou a través dun método setter. A implementación do método de manexo de mensaxes pode chamar a un método para manexar as peticións das que é responsable ou, en caso contrario, se non pode xestionar unha delas delega a petición no seu sucesor.
 
* '''Cliente''' : Envía unha petición a algún Manexador Concreto da cadea.
 
Liña 47 ⟶ 45:
Cadea de sucesores:
* Definir novos enlaces (normalmente no Manexador, pero tamén podería ser nos obxector ManexadorConcreto).
* Usar enlaces existentes (outras asociacións existentes). Por exemplo, no patrónpadrón Composición pode existir xa un enlace ó pai que pode utilizarse para definir a cadea de responsabilidade sen necesidade de engadir outra asociación.
* Conexión de sucesores. Se non hai referencias preexistentes para definir unha cadea, entón teremos que introducilas nosoutros mesmos. Neste caso, o Manexador define a interface e ademais encárgase de manter o sucesor. Isto permite que o Manexador proporcione unha implementación predeterminada de ManexarPetición que reenvíe a petición ó sucesor (se hai algún). Se unha subclase de ManexadorConcreto non está interesada en dita petición, non ten que redefinir a operación de reenvío.
 
Liña 54 ⟶ 52:
* único método parametrizado para distinguir distintas peticións. Isto permite un número arbitrario de peticións pero emisor e receptor deben poñerse de acordo sobre como codificar a petición.
 
== Patrónspadróns relacionados ==
Este patrónpadrón pódese aplicar conxuntamente co patrónpadrón [[Composite (patrónpadrón de deseño)|Composite]]. Neste, os pais dos compoñentes poden actuar como sucesores.
 
== Exemplo de implementación ==
[[Ficheiro:DClasesGL.jpg|centro|500px|]]
 
<big><source lang="java">
Liña 161 ⟶ 159:
</big>
 
[[Ficheiro:SecuenciaGL.jpg|centro|600px|]]
 
[[Categoría:Padróns de deseño]]