Programação com Objectos PADRÕES DE DESENHO Classificaçã Objectivo Criação Estrutura Comportamento Introdução Alguns Padrões de Desenho Classe Factory Method Adapter Interpreter Template Method O que é um Padrão de Desenho? P.D. e os problemas do desenho Como seleccionar um P.D. Como usar um P.D. Exemplo: um editor gráfico Composite Catálogo de Padrões de Desenho Conclusões Alcance Objecto Abstract Factory Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor - 1 - - 2 - Intençã Motivaçã Intenção Compor objectos em estruturas (árvores) Tratar objectos individuais e composições uniformemente Permitir a composição recursiva sem que os clientes tenham de se preocupar com o tipo de objecto que estão a considerar: s, ou Elementos compostos Composto Composto - 3 - - 4 -
Solução Motivaçã ção Classe abstracta (Graphic) representativa de folhas e objectos Compostos s (subclasses de Graphic) Uma classe (Picture), subclasses de Graphic, que permite agregar objectos do tipo Graphic Aplicabilidade Quando se pretendem representar hierarquias parte-todo Os clientes devem poder ignorar as diferenças entre composições de objectos e objectos individuais - 5 - - 6 - Estrutura Participantes Component (Graphic) Declara a interface para os objectos da composição Realiza o comportamento por omissão para a interface comum a todas as classes Define uma interface para aceder e manipular os filhos Define uma interface para aceder ao pai na estrutura (opcional) Um objecto Composite tem o seguinte aspecto: acomposite Leaf (Rectangle, Line, Text, ) Representa as folha da estrutura Define o comportamento dos objectos primitivos acomposite - 7 - - 8 -
Participantes (cont.) Colaboraçõ ções Composite (Picture) Define o comportamento para os componentes que têm filhos Guarda componentes do tipo filho Realiza operações relacionadas com os filhos pertencentes à interface de Component Client Manipula os objectos agregados através da interface de Component Os Clients usam a interface da classe Component para interagir com os objectos da estrutura Composite Se o recipiente é uma folha, os pedidos são tratados directamente Se o recipiente for um Composite, os pedidos são redireccionados para os filhos da estrutura, que possivelmente reenvia novos pedidos aos seus filhos, - 9 - - 10 - Consequências ncias Consequências ncias Vantagens Define hierarquias compostas Por objectos primitivos e objectos compostos A composição é recursiva Sempre que um cliente esperar um objecto primitivo também suporta um objecto composto Desvantagens O desenho pode ser demasiado geral Não é possível impor restrições aos componentes de um objecto composto Têm de se realizar testes na execução Simplifica o cliente Que passam a tratar estruturas e objectos individuais de forma uniforme Não precisam saber qual o tipo de objectos que estão a processar, evitando-se testes do tipo case Facilita a introdução de novos objectos primitivos - 11 - Os clientes não precisam de ser alterados quando surgem novos objectos primitivos - 12 -
Implementaçã Manter referências dos pais nos filhos Partilha de Components Maximizar a interface de Component Declaração das operações de manipulação nos filhos Deve Component definir uma lista de Components Exemplo interface Componente {void escreve(); class implements Componente { private int _valor; public (int val) { _valor = val; System.out.print(_valor + " "); Ordenação dos filhos Memorizar (cache) para melhorar a eficiência Quem deve apagar os Components Qual a melhor estrutura para guardar os Components - 13 - - 14 - abstract class No implements Componente { private Componente[] _filhos = new Componente[9]; private int _total = 0; private int _valor; public No(int val) { _valor = val; public void add(componente c) { _filhos[_total++] = c; System.out.print(_valor + " "); for (int i=0; i < _total; i++) { _filhos[i].escreve(); class Linha extends No { public Linha(int val) { super(val); System.out.print("Linha"); super.escreve(); class Coluna extends No { public Coluna(int val) { super(val); System.out.print("Col"); super.escreve(); // Dois tipos de classes // "contentores". // A maior parte da // "carne" está na classe // de base No. - 15 - - 16 -
Usos conhecidos public class CompostoDemo { public static void main(string[] args) { Composto primei = new Linha(1); Composto segund = new Coluna(2); Composto tercei = new Coluna(3); Composto quarto = new Linha(4); Composto quinto = new Linha(5); primei.add(segund); primei.add(tercei); tercei.add(quarto); tercei.add(quinto); primei.add(new (6)); segund.add(new (7)); tercei.add(new (8)); quarto.add(new (9)); quinto.add(new (10)); primei.escreve(); // Linha1 // // +-- Col2 // // +-- 7 // +-- Col3 // // +-- Linha4 // +-- 9 // +-- Linha5 // +-- 10 // +-- 8 // +-- 6 Editor gráfico Compilador de Smalltalk Classe View do Smalltalk Definição de uma carteira de acções // Linha1 Col2 7 Col3 Linha4 9 Linha5 10 8 6-17 - - 18 - Padrões relacionados Chain of Responsibility A ligação ao pai pode ser usada por Chain of Responsibility Decorator - 19 - Quando usadas em conjunto partilham a mesma super-classe Decorator vão ter de suportar a interface de Component (Add, Remove, GetChild, ) Flyweight Permite partilhar componentes (mas não podem referir os pais) Iterator Usado para varrer as estruturas Composite Visitor Localiza operações e comportamento que caso contrário estariam distribuídos pelas classes Composite e Visitor