Chain of Responsibility 1 Chain of Responsibility • Definição: padrão cuja função principal é evitar o acoplamento de um objeto remetente com o seu objeto receptor. • Solução: 1. Dar a mais de um objeto a chance de manipular a mensagem (requisição). 2. Encadear os objetos receptores e passar a mensagem ao longo da cadeia, até que um dos objetos da cadeia seja capaz de responder à mensagem. 2 Estrutura do Chain of Responsibility 3 Chain of Responsibility - Participantes • Handler – define uma interface para manipulação de requisições – (opcional) implementa a ligação entre os receptores • ConcreteHandler – Manipula requisições pelas quais é responsável – Pode fazer accesso ao seu sucessor – Se ConcreteHandler pode manipular a requisição, ele o faz; senão, ele repassa a requisição para seu sucessor • Client – Inicia a requisição a um objeto ConcreteHandler da cadeia 4 Chain of Responsibility - Exemplo • Correspondências no exemplo do DoFactory: – Handler (Approver) – ConcreteHandler (Director, VicePresident, President) – Client (ChainApp) 5 Prototype 6 Prototype • É utilizado para criar diversas cópias de um mesmo objeto. • Útil quando a criação de um objeto a partir do zero é muito cara computacionalmente falando. • Em vez de criar novas instâncias, crie cópias de instâncias pré-existentes (protótipos) e modifique essas cópias, conforme a necessidade. • O protótipo criado é um clone do objeto original. 7 Estrutura do Prototype 8 Prototype - participantes • Prototype – Declara uma interace para clonar a si próprio • ConcretePrototype – implementa uma operação para clonar a si próprio. Essa operação retorna um objeto da mesma classe e com os mesmos valores de atributos to objeto protótipo utilizado. • Client – Cria um novo objeto através do envio de uma a requisição a um protótipo para clonar a si próprio. 9 Bridge 10 Bridge • O padrão Bridge permite desacoplar uma abstração de sua implementação, de tal forma que as duas possa variar independentemente uma da outra. – Entenda abstração como uma interface. – Note que em linguagens como Java, uma classe que implemente uma interface fica acoplada a essa interface (A implements B). O padrão Bridge permite eliminar essa restrição. 11 Estrutura do Bridge 12 Bridge (Participantes) • Abstraction – Define a interface da abstração. – Mantém uma referência para um objetos to tipo Implementor. • RefinedAbstraction – estende a interface definida por Abstraction. • Implementor – Define a interface para classes que implementam a abstração. – Esta interface não precisa corresponder à interface de Abstraction; in fact the two interfaces can be quite different. – Tipicamente, a interface Implementation fornece somente operações básicas, e Abstraction define operações de alto nível baseadas nessas primitivas. • ConcreteImplementor – Implementa a interface Implementor e define sua implementação concreta. 13 Builder 14 Builder • O padrão Builder separa a construção de um objeto complexo da sua representação de tal forma que o mesmo processo de construção possa criar diferentes representações. • Esse padrão é motivado pelo desejo de variar a representação interna do produto que ele constrói e, ao mesmo tempo, esconder detalhes acerca de como o produto é montado. • O cliente instrui o objeto builder sobre como criar o objeto a então solicita o resultado da criação. • GOF: “is intended to decouple the process of building a complex object from the parts that make up the object” 15 Builder - estrutura 16 Builder - participantes • O padrão Builder tem dois participantes principais, Director e Builder. • O objeto Director, responsável pela organização geral do objeto Product, faz chamadas ao Builder. • O Builder constrói o objeto complexo, chamado de Product, sob o controle do objeto Director. 17 Builder - aplicabilidade • O padrão Builder pode ser aplicado em situações em que alguma coisa (o produto) é formada (criada, construída) a partir de partes menores. • O padrão criacional Builder permite que se varie a estrutura interna de um produto, assim como a maneira como esse produto é montado. • The Builder creational pattern lets you vary a product's internal structure, as well as how it gets assembled. Because you construct the object through an abstract interface, you can define a new kind of builder for a product to assemble it from different structures. The client need not know anything about the construction process, nor the parts that make up a product. You get a high degree of control in the construction process. 18 Builder (exemplo livro GoF) • Leitor para documentos RTF que exporta para vários formatos. – Programa que converte RTF em outros formatos. – Consiste de um Leitor/Parser e de um Conversor – Dá suporte a diferentes conversões e formatos. • Objetivos: – – – – Deve ser possível adicionar um novo formato facilmente. Separar o conversor do Leitor/Parser Deve ser possível reutilizar o algoritmo do Leitor/Parser O verdadeiro problema é que a quantidade de conversões em pontencial é ilimitado. – É desejável a possibilidade de adicionar uma nova conversão sem modificar o leitor. 19 Builder (exemplo livro GoF) • Cada classe conversora é chamada um BUILDER e a classe leitora é o DIRECTOR. – O padrão Builder separa o algoritmo para tratar um determinado formato de como um arquivo convertido é criado e representado. 20