Chain of Responsibility (padrón de deseño): Diferenzas entre revisións
Contido eliminado Contido engadido
Sen resumo de edición |
arranxiños ortográficos |
||
Liña 1:
Un patró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
▲O [[Patrón_de_deseño|patrón de deseño]] '''Cadea de Responsabilidade''' é un patrón de comportamento 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ó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 ventanas 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
[[Ficheiro:Motivacion2GL.png|center|500px|]]
[[Ficheiro:Motivacion3GL.jpg|center|500px|]]
[[Ficheiro:Motivacion1GL.jpg|center|500px|]]
== Aplicabilidade ==
* Cando
* Se non se desexa identificar explicitamente quen é o receptor da petición.
* Cando os obxectos que poden manexar a petición varían dinamicamente.
==
[[Ficheiro:EstructuraGL.jpg|center|500px
== Participantes ==
* '''Manexador''' : A interface que define o método usado para pasar unha
* '''Manexador concreto''' : Unha clase que implementa a interface Handler e mantén unha referencia ó seguinteHandler. Esta referencia pode ser asignada no
* '''Cliente''' : Envía unha petición a algún Manexador Concreto da cadea.
Liña 38 ⟶ 39:
== Consecuencias ==
* Reduce o acoplamento de obxectos: tanto o manexador como o cliente non coñecen a
* Flexibilidade engadida á hora de engadir responsabilidades a obxectos: por exemplo, no caso de ter un departamento de recepción de documentos que está moi ocupado atendendo a varios clientes á vez, pódese facer que a secretaría reciba algúns dos documentos e que o porteiro faga o mesmo.
* A Cadea de Responsabilidades ofrece unha gran flexibilidade no procesamento de eventos para unha aplicación, xa que domina o manexo de eventos complexos dividindo as responsabilidades a través dun número de elementos simples, permitindo a un grupo de clases comportarse como un todo.
* A recepción da petición non está
== Implementación ==
Liña 48:
* 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ó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,
Representación das peticións
* un método por cada petición.
* único método parametrizado para distinguir distintas peticións.
▲== Patróns Relacionados ==
▲ Este patrón pódese aplicar conxuntamente co patrón [[Composite (patrón de deseño)|Composición]]. Neste, os pais dos compoñentes poden actuar como sucesores.
== Exemplo de Implementación ==
[[Ficheiro:DClasesGL.jpg|center|500px|]]
<big><source lang="java">
Liña 70 ⟶ 65:
public static void main(String argv[]) {
Unidade smith = new Coronel("Smith", null);
Unidade truman = new Coronel("Truman", "Tomar posición
Unidade ryan = new Soldado("Ryan");
Unidade rambo = new Soldado("Rambo");
Liña 93 ⟶ 88:
public abstract class Unidade {
/* No
public Unidade(String nome) {
Liña 107 ⟶ 101:
public void establecerMando(Unidade mando) { _mando = mando; }
/* comportamento por defecto da cadea: delegar no mando directo ou, se se alcanza o final da cadea, utilizar unha resolución por defecto (sen orde) */
public String orde() {
Liña 129 ⟶ 122:
public class Coronel extends Unidade {
//
public Coronel(String nome, String orde) {
Liña 150 ⟶ 143:
<source lang="java">
/**
* Esta clase é unha extensión instanciable da superclase Unidade que
* comportamento por defecto da cadea de responsabilidade
*/
Liña 156 ⟶ 149:
public class Soldado extends Unidade {
// o
public Soldado(String nome) {
Liña 167 ⟶ 160:
</big>
[[Ficheiro:SecuenciaGL.jpg|center|600px|]]
|