Patterns

66
Pattern - Definição O que é um Padrão (Pattern) ? Define padrão como uma solução permanente para um problema em um contexto. Contexto é o ambiente , circunstancias, situação ou condições interdependentes dentro do qual algo existe. O que é uma Estratégia ? - Os padrões são descritos em um nível alto de Abstração. Ao mesmo tempo cada padrão inclui várias estratégias que fornecem detalhes de implementação em diversos níveis de abstração. GOF - Os padrões GoF (Gamma et al., 1994) formam um catálogo de boas - decisões de projeto.

description

Pattern

Transcript of Patterns

Page 1: Patterns

Pattern - Definição

O que é um Padrão (Pattern) ?• Define padrão como uma solução permanente para um

problema em um contexto. Contexto é o ambiente , circunstancias, situação ou condições interdependentes dentro do qual algo existe.

O que é uma Estratégia ?- Os padrões são descritos em um nível alto de Abstração. Ao mesmo

tempo cada padrão inclui várias estratégias que fornecem detalhes de implementação em diversos níveis de abstração.

GOF- Os padrões GoF (Gamma et al., 1994) formam um catálogo de boas - decisões de projeto.

Page 2: Patterns

Classificação dos Patterns

•Padrões de Criação (Creational)

• Abstract Factory, Builder, Factory Method, Prototype, Singleton.

•Padrões de Estrutura (Structural)• Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.

•Padrões de Comportamento(Behavioral)• Chain of Responsability, Command, Interpreter, Iterator, Mediator,

Memento, Observer, State, Strategy, Template Method, Visitor.

Page 3: Patterns

GOFPropósito

Criação Estrutura Comportamento

Escopo

Classe Factory Method Class AdapterInterpreter

Template Method

Objeto

Abstract Factory Object Adapter Chain of Responsibility

Builder Bridge Command

Prototype Composite Iterator

Singleton Decorator Mediator

Factory Method Facade Memento

Flyweight Observer

Proxy State

Strategy

Visitor

Classificando os Patterns

Page 4: Patterns

Classificando os PatternsGoF segundo Metsker

Intenção Padrões

Interfaces Adapter, Facede,Composite, Bridge

Responsabilidade Singleton, Observer, Mediator, Proxy, Chain of Repository, Flyweitght

Construção Builder, Factory Method, Abstract Factory, Prototype, Memento

Operações Template Method, State, Strategy, Command, Interpreter

Extensões Decorator, Iterator, Visitor

Page 5: Patterns

Patterns de Criação• Singleton: Garantir que uma classe só tenha uma única instância, e

prover um ponto de acesso global a ela.

• Factory Method: Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar.

• Abstract Factory : Definir uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas

• Builder : Separar a construção de objeto complexo da representação para criar representações diferentes com mesmo processo.

• Prototype : Especificar tipos a criar usando uma instância como protótipo e criar novos objetos ao copiar este protótipo.

Page 6: Patterns

Pattern Singleton• Intenção: Você deseja ter somente um objeto de uma classe, mas não existe

nenhum objeto global que controle a instanciação deste objeto

• Problema: Vários objetos Clientes deferentes precisam se referir ao mesmo objeto e você deseja assegurar que não terá mais de um deles.

• Solução: Garantir a existência de uma única instância para este objeto.

• Participantes: Clientes que criam uma instancia da classe Singleton tão-somente por meio de um método getInstance().

Page 7: Patterns

Pattern Singleton1.public class SingletonImplementation {2. 3. private static SingletonImplementation instance;4. 5. /**6. * Creates a new SingletonImplementation object.7. */8. private SingletonImplementation () {9. // initialize all attributes. 10. }11. 12. /**13. * Retrieves Singleton Instance for SingletonImplementation 14. * @return SingletonImplementation singletonImplementation 15. */16. public synchronized static SingletonImplementation

getInstance() { 17. if (instance == null) {18. instance = new SingletonImplementation ();19. }20. return instance ;21. } 22. }

Page 8: Patterns

Singleton - Exemplo

• class Singleton{ private static Singleton instance; private Singleton(){}

• public static Singleton getInstance(){ if( instance == null ){ instance = new Singleton();

} return instance; }}

Page 9: Patterns

Diagrama• O Cliente nunca terá acesso ao construtor da classe Singleton,

somente ao método getInstance que garantirá uma única instancia desta classe.

• Exemplo de um método cliente de Singleton.

1. SingletonImplementation singleton =

2. SingletonImplementation.getInstance();

Page 10: Patterns

Patterns de Criação• Singleton: Garantir que uma classe só tenha uma única instância, e

prover um ponto de acesso global a ela.

• Factory Method: Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar.

• Abstract Factory : Prover interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas

• Builder : Separar a construção de objeto complexo da representação para criar representações diferentes com mesmo processo.

• Prototype : Especificar tipos a criar usando uma instância como protótipo e criar novos objetos ao copiar este protótipo.

Page 11: Patterns

Factory Method

• Intenção : Definir uma interface para criar um objeto, deixando, porem que as subclasses decidam qual classe instanciar. Delegar a instanciação para as subclasses.

• Problema: Uma classe precisa de instanciar uma derivação de uma outra mas não sabe qual. O FactoryMethod permite que uma classe derivada tome esta decisão.

• Solução: Uma classe derivada decide qual classe instanciar e o modo como instanciá-la.

• Participantes: Produto é a interface para o tipo de objeto que o Factory Method cria. Gerador é a interface que decide o FactoryMethod.

Page 12: Patterns

Factory Method

É uma interface para instanciação de objetos que mantém isoladas as classes concretas usadas da requisição da criação destes objetos.

• Separa assim:• Uma “família” de classes dotadas da mesma interface

(“produtos”); e• Uma classe (“fábrica”) que possui um método especial

(o factory method) que cria tais objetos.

Page 13: Patterns

Pattern Factory Method

Page 14: Patterns

class Test{ public static void main(String a[] ){ Creator c ; // If A is neededc = new ConcreteCreatorA() ; // else c = new ConcreteCreatorB() ; Product p = c.create() ; }}

• abstract class Product{ ...}

class ConcreteProductA extends Product{ ...}

class ConcreteProductB extends Product{ ...}

• --------------------• abstract class Creator{

public abstract Product create();}

class ConcreteCreatorA extends Creator{ public Product create(){ return new ConcreteProductA() ; }}

class ConcreteCreatorB extends Creator{ public Product create(){ return new ConcreteProductB() ; }}

EXEMPLO

Page 15: Patterns

Patterns de Criação• Singleton: Garantir que uma classe só tenha uma única instância, e

prover um ponto de acesso global a ela.

• Factory Method: Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar.

• Abstract Factory : Prover interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas

• Builder : Separar a construção de objeto complexo da representação para criar representações diferentes com mesmo processo.

• Prototype : Especificar tipos a criar usando uma instância como protótipo e criar novos objetos ao copiar este protótipo.

Page 16: Patterns

Pattern Builder

"Separar a construção de um objeto complexo de sua representação para que o mesmo processo

de construção possa criar representações diferentes.”

Problema

• O cliente precisa criar um objeto, porém, o processo de criação é complexo e pode variar.

Page 17: Patterns

Pattern Builder

Solução• Separar a construção de sua representação assim como

a construção possa criar diferentes representações.

• Exemplo:

Cliente

Page 18: Patterns

Pattern Builder

Cliente Funcionário(Diretor)

Equipe Rest.(Builder)

Faz o pedido

Pega o pedido

build

build

build

build

Pega o pedido

Page 19: Patterns

Pattern Builder

Page 20: Patterns

Pattern Builder

Quando Usar ?

• Use quando o algoritmo para criar um objeto complexo precisar ser independente das partes que compõem o objeto e da forma como o objeto é construído.

• Use quando o processo de construção precisar suportar representações diferentes do objeto que está sendo construído

Page 21: Patterns

Patterns de Criação• Singleton: Garantir que uma classe só tenha uma única instância, e

prover um ponto de acesso global a ela.

• Factory Method: Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar.

• Abstract Factory : Prover interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas

• Builder : Separar a construção de objeto complexo da representação para criar representações diferentes com mesmo processo.

• Prototype : Especificar tipos a criar usando uma instância como protótipo e criar novos objetos ao copiar este protótipo.

Page 22: Patterns

Pattern PrototypePattern Prototype

"Especificar os tipos de objetos a serem criados usando uma instância como protótipo e criar novos objetos ao copiar este

protótipo.” [ GoF ]

• O padrão Prototype permite que um cliente crie novos objetos ao copiar objetos existentes.

• Uma vantagem de criar objetos deste modo é poder aproveitar o estado existente de um objeto.

Page 23: Patterns

Prototype

Problema• Criar um objeto novo, mas aproveitar o estado previamente

existente em outro objeto

Page 24: Patterns

Prototype

Page 25: Patterns

Prototype

• O Pattern Prototype é implementado da Interface Cloneable.

Circulo c = new Circulo(4, 5, 6);Circulo copia = (Circulo) c.clone();

• Se o objeto apenas contiver tipos primitivos em seus campos de dados, é preciso • declarar que a classe implementa Cloneable• sobrepor clone() da seguinte forma:

public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; }}

Page 26: Patterns

Prototype – Exemplo

• Se o objeto contiver campos de dados que são referências a objetos, é preciso fazer cópias desses objetos também.

1. public class Circulo implements Cloneable {2. private Ponto origem;3. private double raio;

4. public Object clone() {5. try {6. Circulo c = (Circulo)super.clone();7. c.origem = origem.clone(); //Ponto deve ser

clonável!8. return c;9. } catch(CloneNotSupportedException e) {10. return null;11. }12. }

13.}

Page 27: Patterns

Patterns Estruturais• Adapter: Converter a interface de uma classe em outra interface esperada pelos

clientes.

• Façade: Oferecer uma interface única de nível mais elevado para um conjunto de interfaces de um subsistema.

• Composite: Permitir o tratamento de objetos individuais e composições desses objetos de maneira uniforme.

• Bridge: Desacoplar uma abstração de sua implementação para que os dois possam variar independentemente.

• Proxy: Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro.

• Flyweight: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos complexos.

• Decorator: Anexar responsabilidades adicionais a um objeto dinamicamente

Page 28: Patterns

Pattern Adapter• Intenção: Casar um objeto existente, fora de seu

controle, com uma interface particular.

• Problema: Um Sistema possui dados e comportamento correto mas interface inadequada. Ele é tipicamente usado quando você tem que fazer algo derivar de sua classe abstrata que estamos definindo ou que já esta definida.

• Solução: O Adapter fornece um empacotador com a interface desejada.

• Participantes: A classe Adapter ajusta a interface de uma classe Adaptada para casar com a classe Alvo derivada de Adapter. Isso possibilita ao cliente usar a classe Adaptada como se fosse um tipo de Alvo.

Page 29: Patterns

Pattern Adapter• Converter a interface de uma classe em outra interface esperada pelos clientes. Adapter

permite a comunicação entre classes que não poderiam trabalhar juntas devido à incompatibilidade de suas interfaces.“ [ GoF ]

Page 30: Patterns

Pattern Adapter

• O Pattern Adapter é dividido em:• Object Adapter: pattern demonstrado anteriormente , uma vez

que se baseia em um objeto (objeto adaptador) contendo um outro (objeto adaptado).

• Class Adapter: Uma maneira de implementar o padrão através de herança múltipla.

Page 31: Patterns

Pattern Adapter – Class Adapterpublic interface ITarget { public void operation();}

public class Adaptee { public Adaptee() { } public void adaptedOperation () { //executa alguma operação } }

public class Adapter extends Adaptee implements

ITarget { public Adapter() { super(); }

public void operation() { super.adaptedOperation(); }}

public class Client { private ITarget iTarget;

public Client() {

// Poderia ser uma fabrica. iTarget = new Adapter();

}

// getter e setters..

public static void main (String[] args) {

Client client = new Client ();

client.getITarget().operation();

} }

Page 32: Patterns

Pattern Adapter• Quando Usar ?

• Sempre que for necessário adaptar uma interface para um cliente

• Class Adapter• Quando houver uma interface que permita a

implementação estática

• Object Adapter• Quando menor acoplamento for desejado• Quando o cliente não usa uma interface Java ou classe

abstrata que possa ser estendida

Page 33: Patterns

Patterns Estruturais• Adapter: Converter a interface de uma classe em outra interface esperada pelos clientes.

• Façade: Oferecer uma interface única de nível mais elevado para um conjunto de interfaces de um subsistema.

• Composite: Permitir o tratamento de objetos individuais e composições desses objetos de maneira uniforme.

• Bridge: Desacoplar uma abstração de sua implementação para que os dois possam variar independentemente.

• Proxy: Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro.

• Flyweight: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos complexos.

• Decorator: Anexar responsabilidades adicionais a um objeto dinamicamente

Page 34: Patterns

Pattern Façade

"Oferecer uma interface única para um conjunto de interfaces de um subsistema. Façade define

uma interface de nível mais elevado que torna o subsistema mais fácil de usar.”

[ GoF ]

Page 35: Patterns

Pattern Façade• Intenção: Você deseja simplificar o uso de um sistema

existente. Precisa definir sua própria interface.

• Problema: Você deseja utilizar somente um subconjunto de um sistema complexo. Ou interagir com o sistema de uma maneira particular

• Solução: O Façade Apresenta uma nova interface para o cliente usar o sistema existente

• Participantes: Ele apresenta uma interface especifica para o cliente o que torna o sistema mais fácil de ser utilizado.

Page 36: Patterns

Pattern Façade

Problema • Para fazer o subsistema funcionar, há diversos controles a serem acionados.

Page 37: Patterns

Pattern Façade

Porém, uma camada intermediária pode delegar as requisições as respectivas funções...

Page 38: Patterns

Pattern Façade

Page 39: Patterns

Pattern Façade

• Façades podem oferecer maior ou menor isolamento entre aplicação cliente e objetos.

• Nível ideal deve ser determinado pelo nível de acoplamento desejado entre os sistemas.

• A Façades mostrada como exemplo isola totalmente o cliente dos objetos

• Quando usar?

• Sempre que for desejável criar uma interface para um conjunto de objetos com o objetivo de facilitar o uso da aplicação

• Permite que objetos individuais cuidem de uma única tarefa, deixando que a fachada

se encarregue de divulgar as suas operações.

Page 40: Patterns

Patterns Estruturais• Adapter: Converter a interface de uma classe em outra interface esperada pelos

clientes.

• Façade: Oferecer uma interface única de nível mais elevado para um conjunto de interfaces de um subsistema.

• Composite: Permitir o tratamento de objetos individuais e composições desses objetos de maneira uniforme.

• Bridge: Desacoplar uma abstração de sua implementação para que os dois possam variar independentemente.

• Proxy: Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro.

• Flyweight: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos complexos.

• Decorator: Anexar responsabilidades adicionais a um objeto dinamicamente

Page 41: Patterns

Pattern Composite

"Compor objetos em estruturas de árvore para representar hierarquias todo-parte. Composite permite que clientes tratem objetos individuais e composições de objetos de

maneira uniforme.” [ GoF ]

Page 42: Patterns

Pattern CompositeSão comuns as situações onde temos que lidar com uma estrutura de

elementos agrupada hierarquicamente (não como meras coleções).

• Composições podem cumprir com este requisito e ainda permitir:• o tratamento da composição como um todo;• ignorar as diferenças entre composições e elementos individuais;• adição transparente de novos tipos a hierarquia;• simplificação do cliente.

Page 43: Patterns

Pattern Composite - Problema• Cliente precisa tratar de

maneira uniforme objetos individuais e composições de objetos

Page 44: Patterns

Pattern Composite – Diagrama de Classe

• Tratar grupos e indivíduos diferentes através de uma única interface

Page 45: Patterns

Pattern CompositeComponente.javapublic abstract class Componente { private String pn; public String getPn() { return pn; } public void setPn(String pn) { this.pn = pn; } public Componente(String pn) { setPn(pn); } public abstract void operacao();

public abstract void add(Componente comp);

public abstract Componente remove(int index);

public abstract Componente getFilho(int index);

public abstract int getComponenteCount();

}

Composite.javapublic class Composite extends Componente { private ArrayList<Componente> componenteList;

public Composite(String pn) { super(pn); componenteList = new ArrayList<Componente>(); } public void operacao() { System.out.println("PN "+ getPn() +

" composto por: "); for(int i = 0; i < getComponenteCount(); i++) { getFilho(i).operacao(); } } public void add(Componente comp) { componenteList.add(comp); } public Componente remove(int index) { return componenteList.remove(index); } public Componente getFilho(int index){ return componenteList.get(index); } public int getComponenteCount() { return componenteList.size(); } }

Page 46: Patterns

Pattern CompositeFolha.javapublic class Folha extends

Componente { public Folha(String pn) { super(pn); }

public void operacao() { System.out.println(getPn()); } public void add(Componente comp){ } public Componente remove(int

index){ return null; } public Componente getFilho(int

index){ return null; } public int getComponenteCount() { return -1; }}

Cliente.javapublic class Cliente {

public static void main(String[] args) {

Folha a1 = new Folha("A1"); Folha a2 = new Folha("A2"); Folha a3 = new Folha("A3");

Composite c1 = new Composite("C1");

c1.add(a1); c1.add(a2);

Composite c2 = new Composite("C2");

c2.add(a3);

Composite c3 = new Composite("C3");

c3.add(c1); c3.add(c2);

c3.operacao(); } }

Page 47: Patterns

Pattern Composite – Quando Usar ?

• Sempre que houver necessidade de tratar um conjunto como um indivíduo

• Há várias estratégias de implementação

Page 48: Patterns

Patterns Estruturais• Adapter: Converter a interface de uma classe em outra interface esperada pelos

clientes.

• Façade: Oferecer uma interface única de nível mais elevado para um conjunto de interfaces de um subsistema.

• Composite: Permitir o tratamento de objetos individuais e composições desses objetos de maneira uniforme.

• Bridge: Desacoplar uma abstração de sua implementação para que os dois possam variar independentemente.

• Proxy: Prover um substituto ou ponto através do qual um objeto possa controlar o acesso a outro.

• Flyweight: Usar compartilhamento para suportar eficientemente grandes quantidades de objetos complexos.

• Decorator: Anexar responsabilidades adicionais a um objeto dinamicamente

Page 49: Patterns

Pattern Proxy – Problema• Sistema quer utilizar um determinado objeto...

• Mas ele não está disponível (remoto, inaccessível, etc)

• Solução: arranjar um intermediário que saiba se comunicar com ele eficientemente

Page 50: Patterns

Pattern Proxy – Diagrama

Objeto Desejado

Page 51: Patterns

Pattern Proxy - Estrutura

• Cliente usa intermediário em vez de sujeito real

• Intermediário suporta a mesma interface que sujeito real

• Intermediário contém uma referência para o sujeito real e repassa chamadas, possivelmente, acrescentando informações ou filtrando dados no processo.

Page 52: Patterns

Pattern Proxypublic class Creso { ... Sujeito deusApolo = Fabrica.getSujeito(); deusApolo.operacao(); ...}

public class DeusApolo implements Sujeito { public Object operacao() { return coisaUtil; }}

public class Oraculo implements Sujeito { private DeusApolo real; public Object operacao() { cobraTaxa(); return real.operacao(); }}

public interface Sujeito { public Object operacao();}

Inacessível ao Cliente

Cliente comunica-se com Objetoatravés dessa classe

Page 53: Patterns

Pattern Proxy – Quando Usar ?

• A aplicação mais comum é em objetos distribuídos

• Vantagens• Transparência: mesma sintaxe usada na comunicação entre o

cliente e sujeito real é usada no proxy• Permite o tratamento inteligente dos dados no cliente

• Desvantagens• Possível impacto na performance• Transparência nem sempre é 100% (fatores externos como

queda da rede podem tornar o proxy inoperante ou desatualizado

Page 54: Patterns

Patterns Comportamentais•Chain of responsibility: enviar uma requisição para vários objetos sem especificar o destinatário explicitamente.

•Command: requisição como objeto, para clientes parametrizarem diferentes requisições, filas, e suportar operações reversíveis.

•Mediator: Definir um objeto que encapsula a forma como um conjunto de objetos interagem.

•Memento: Externalizar o estado interno de um objeto para que o objeto possa ter esse estado restaurado posteriormente.

•State: Permitir a um objeto alterar o seu comportamento quanto o seu estado interno mudar.

•Strategy: Definir uma família de algoritmos, encapsular cada um, e fazê-los intercambiáveis.

Page 55: Patterns

Behavioral

Chain of responsibility (cadeia de responsabilidade)

Intenção:

• Uma maneira de passar um pedido entre uma cadeia de objetos

Observações:

• O objeto que trata a solicitação deve ser escolhido automaticamente;• Deve-se emitir uma solicitação para um dentre vários objetos, • O conjunto de objetos que pode tratar uma solicitação deveria ser

especificado dinamicamente.

Page 56: Patterns

Exemplo

Page 57: Patterns

Behavioral

Command (Comando)

Intenção:

•encapsular uma solicitação de comando como um objeto.

Observações:

•Parametrizar objetos por uma ação a ser executada.•Especificar, enfileirar e executar solicitações em tempos diferentes.•Especificar, enfileirar e executar solicitações em tempos diferentes.

Page 58: Patterns

Uml

Page 59: Patterns

Behavioral

Mediator (Mediador)

Intenção:

•Define comunicação simplificada entre classes;

Observações:

•Mediator pode alavancar Observer para registrar dinamicamente colegas e se comunicar com eles.•Ele permite a unificação da interface de um sistema

Page 60: Patterns

Behavioral

Memento 

Intenção:

•Sem violar o encapsulamento, captura e externaliza o estado interno de um objeto para que o objeto pode ser devolvido a este estado mais tarde.

Observações:

•Memento é muitas vezes utilizado em conjunto com Iterator. •Pode usar Memento para manter o estado necessário para uma operação de desfazer.

Page 61: Patterns

Uml

Page 62: Patterns

BehavioralState (Estado)

Intenção:

• Permite que um objeto altere seu comportamento quando seu estado interno muda. O objeto aparecerá para mudar sua classe.

Observações:

• Facilita a expansão de estados.• Facilita a localizar as responsabilidades de estados específicos,• Os objetos Estado podem ser compartilhados se eles não contêm variáveis de instância

Page 63: Patterns

Uml

Page 64: Patterns

Behavioral

Strategy (Estratégia)

Intenção;

•Encapsula um algoritmo dentro de uma classe 

Observações:

•Strategy permite definir novas operações sem alterar as classes dos elementos sobre os quais opera. •Definir uma família de algoritmos e encapsular cada algoritmo como uma classe.

Page 65: Patterns

Uml

Page 66: Patterns

FIM