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 [[
Un
== 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
[[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
* 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.
==
Este
== 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]]
|