padrões de projeto de software -...

236
Luiz Leão [email protected] http://www.luizleao.com Padrões de Projeto de Software Unidade 2 Padrões GoF

Upload: vuongtram

Post on 13-Dec-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Luiz Leão – [email protected]

http://www.luizleao.com

Padrões de Projeto de Software

Unidade 2 – Padrões GoF

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Conteúdo Programático

• PADRÕES CRIAÇÃO

– Abstract Factory

– Builder

– Factory Method

– Prototype

– Singleton.

• PADRÕES

ESTRUTURAIS

– Adapter

– Bridge

– Composite

– Decorator

– Façade

– Flyweight

– Proxy

• PADRÕES

COMPORTAMENTAIS

– Chain of

Responsibility

– Command

– Interpreter

– Iterator

– Mediator

– Memento

– Observer

– State

– Strategy

– Template Method

– Visitor

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• Um padrão encerra o conhecimento de uma pessoa muito

experiente em um determinado assunto de uma forma

que este conhecimento pode ser transmitido para outras

pessoas menos experientes.

• Outras ciências (p.ex. química) e engenharias possuem

catálogos de soluções.

• Desde 1995, o desenvolvimento de software passou a ter

o seu primeiro catálogo de soluções para projeto de

software: o livro do GoF (Gang of Four).

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• E. Gamma and R. Helm and

R. Johnson and J. Vlissides.

Design Patterns 5 - Elements

of Reusable Object-Oriented

Software. Addison-Wesley,

1995.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• Passamos a ter um vocabulário comum para conversar

sobre projetos de software.

• Soluções que não tinham nome passam a ter nome.

• Ao invés de discutirmos um sistema em termos de pilhas,

filas, árvores, passamos a falar de 6 coisas de muito mais

alto nível como Fábricas, Fachadas, Observador,

Estratégia, etc.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• A maioria dos autores eram entusiastas de Smalltalk,

principalmente o Ralph Johnson.

• Mas acabaram baseando o livro em C++ para que o

impacto junto à comunidade de C fosse maior.

• E o impacto foi enorme, o livro vendeu centenas de

milhares de cópias.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• PADRÕES CRIAÇÃO

– Abstract Factory

– Builder

– Factory Method

– Prototype

– Singleton.

• PADRÕES ESTRUTURAIS

– Adapter

– Bridge

– Composite

– Decorator

– Façade

– Flyweight

– Proxy

• PADRÕES

COMPORTAMENTAIS

– Chain of Responsibility

– Command

– Interpreter

– Iterator

– Mediator

– Memento

– Observer

– State

– Strategy

– Template Method

– Visitor

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Classificação, segundo GoF

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Classificação, segundo Metsker

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• Encontrando objetos apropriados: a decomposição é influenciada

por fatores tais como encapsulamento, granularidade,

dependências, flexibilidade, desempenho, evolução, reutilização,

etc. Frequentemente surgem classes que não possuem

correspondentes no negócio

• Determinando a granularidade do objeto

• Especificando as interfaces dos objetos: um tipo denota uma

interface em particular. Um objeto pode ter muitos tipos e

diferentes objetos podem ter um mesmo tipo. Ligação dinâmica e

polimorfismo

Como os padrões resolvem os problemas?

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• Especificando a implementação de objetos:

– Notação para classe.

– Instanciação (seta tracejada).

– Herança de classe (implementação).

– Classes abstratas (em itálico).

– Classes mix-in.

– Diferença entre a classe (implementação) e o tipo (interface) do

objeto

Como os padrões resolvem os problemas?

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Catálogo de Padrões (GoF)

• Todo padrão inclui o mínimo:

– Nome

– Problema

– Solução

– Consequências

– Exemplo

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Formato dos Padrões (GoF)

• Nome (inclui número da página): Um bom nome é

essencial para que o padrão tenha aceitação da

comunidade

• Objetivo / Intenção

• Motivação: Um cenário realista mostrando o problema e

a necessidade da solução

• Aplicabilidade: Como reconhecer as situações nas

quais o padrão é aplicável

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Formato dos Padrões (GoF)

• Estrutura: Uma representação gráfica da estrutura de

classes do padrão (usando OMT91) em, às vezes,

diagramas de interação (Booch 94)

• Participantes: As classes e objetos que participam e

quais são suas responsabilidades

• Colaborações: Como os participantes colaboram para

exercer as suas responsabilidades

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Formato dos Padrões (GoF)

• Conseqüências: Vantagens e desvantagens, trade-offs

• Implementação: Com quais detalhes devemos nos

preocupar quando implementamos o padrão, entre eles,

aspectos específicos de cada linguagem

• Exemplo de Código: No caso do GoF, em C++ (a

maioria) ou Smalltalk. Implementaremos em Java

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Formato dos Padrões (GoF)

• Usos Conhecidos: Exemplos de sistemas reais de

domínios diferentes onde o padrão é utilizado

• Padrões Relacionados: Quais outros padrões devem ser

usados em conjunto com esse quais padrões são

similares a este, quais são as diferenças

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Formato dos Padrões (GoF)

• Alguns padrões são utilizados em conjunto.

Ex: Composite com Iterator ou Visitor

• Alguns outros são alternativos.

Ex: Prototype ou Abstract Factory

• Alguns padrões apresentam projeto similar, embora

tenham diferentes propósitos.

Ex: Composite e Decorator

Exemplo:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Tipos de Padrões de Projeto

• Padrões de Criação: Estão relacionados com a forma

que os objetos são criados

• Padrões Estruturais: Tratam das associações entre

classes e objetos

• Padrões Comportamentais: Tratam das interações e

divisões de responsabilidades entre as classes ou

objetos.

Padrões de Criação

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões de Criação

• Os padrões de criação tem como intenção

principal abstrair o processo de criação de

objetos, ou seja, a sua instanciação.

• Desta maneira o sistema não precisa se

preocupar com questões sobre, como o objeto é

criado, como é composto, qual a sua

representação real.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões de Criação

• Quando se diz que o sistema não precisa se

preocupar com a instanciação do objeto quer

dizer que, se ocorrer alguma mudança neste

ponto, o sistema em geral não será afetado.

• Isso é a famosa flexibilidade que os padrões de

projeto buscam.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões de Criação

• Padrões de criação com escopo de classe vão

utilizar herança para garantir que a flexibilidade.

Por exemplo, o padrão Factory Method pode

criar várias subclasses para criar o produto.

• Já os padrões com escopo de Objeto, como o

Prototype, delegam para um objeto (no caso o

protótipo) a responsabilidade de instanciar novos

objetos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões de Criação

• Abstract Factory

• Builder

• Factory Method

• Prototype

• Singleton.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory

• Intenção:

– Prover uma interface para criação de famílias

de objetos relacionados sem especificar sua

classe concreta.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory

• Motivação: – Considere uma aplicação com interface gráfica que é

implementada para plataformas diferentes (Motif para UNIX e

outros ambientes para Windows e MacOS).

– As classes implementando os elementos gráficos não podem ser

definidas estaticamente no código. Precisamos de um

implementação diferente para cada ambiente. Até em um mesmo

ambiente, gostaríamos de dar a opção ao usuário de implementa

diferentes aparências (look-and-feels).

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory

• Motivação (Cont.): – Podemos solucionar este problema definindo uma classe abstrata

para cada elemento gráfico e utilizando diferentes

implementações para cada aparência ou para cada ambiente.

– Ao invés de criarmos as classes concretas com o operador new,

utilizamos uma Fábrica Abstrata para criar os objetos em tempo

de execução.

– O código cliente não sabe qual classe concreta utilizamos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory

• Aplicabilidade: Pode ser usado quando: – Um sistema deve ser independente da forma como

seus produtos são criados e representados;

– Um sistema deve poder lidar com uma família de

vários produtos diferentes;

– Você quer prover uma biblioteca de classes de

produtos mas não quer revelar as suas

implementações, quer revelar apenas suas interfaces.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Participantes

• AbstractFactory (WidgetFactory)

• ConcreteFactory (MotifWidgetFactory, WindowsWidgetFactory)

• AbstractProduct (Window, ScrollBar)

• ConcreteProduct (MotifWindow, MotifScrollBar, WindowsWindow,

WindowsScrollBar)

• Client - Usa apenas as interfaces declaradas pela

AbstractFactory e pelas classes AbstratProduct

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Colaborações

• Normalmente, apenas uma instância de ConcreteFactory é criada em tempo de execução.

• Esta instância cria objetos através das classes ConcreteProduct correspondentes a uma família de

produtos.

• Uma AbstractFactory deixa a criação de objetos para

as suas subclasses ConcreteFactory.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Consequências

• Isola as classes concretas dos clientes;

• Facilita a troca de famílias de produtos (basta trocar

uma linha do código pois a criação da fábrica concreta

aparece em um único ponto do programa);

• Promove a consistência de produtos (não há o perigo

de misturar objetos de famílias diferentes);

• Dificulta a criação de novos produtos

• Ligeiramente diferentes (pois temos que modificar a

fábrica abstrata e todas as fábricas concretas).

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Implementação

• Fábricas abstratas em geral são implementadas como

Singleton.

• Na fábrica abstrata, cria-se um método fábrica para cada

tipo de produto.

• Cada fábrica concreta implementa o código que cria os

objetos de fato.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Implementação

• Se tivermos muitas famílias de produtos, teríamos um

excesso de classes "fábricas concretas".

• Para resolver este problema, podemos usar o Prototype:

criamos um dicionário mapeando tipos de produtos em

instâncias prototípicas destes produtos.

• Então, sempre que precisarmos criar um novo produto

pedimos à sua instância prototípica que crie um clone

(usando um método como clone() ou copy()).

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Implementação

• Em linguagens dinâmicas como Smalltalk onde classes

são objetos de primeira classe, não precisamos guardar

uma instância prototípica, guardamos uma referência

para a própria classe e daí utilizamos o método new para

construir as novas instâncias.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Usos Conhecidos

• InterViews: Usa fábricas abstratas para encapsular diferentes tipos

de aparências para sua interface gráfica

• ET++: Usa fábricas abstratas para permitir a fácil portabilidade para

diferentes ambientes de janelas (XWindows e SunView, por exemplo)

• Sistema de captura e reprodução de vídeo feito na UIUC usa fábricas

abstratas para permitir portabilidade entre diferentes placas de

captura de vídeo.

• Em linguagens dinâmicas como Smalltalk (e talvez em POO em

geral) classes podem ser vistas como fábricas de objetos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Exemplo

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• WidgetFactory.java

abstract class WidgetFactory {

public static WidgetFactory obterFactory() {

if(Configuracao.obterInterfaceGraficaAtual() == Configuracao.MotifWidget) {

return new MotifWidgetFactory();

} else {

return new QtWidgetFactory();

}

}

public abstract Botao criarBotao();

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• MotifWidgetFactory.java

class MotifWidgetFactory extends WidgetFactory {

public Botao criarBotao() {

return new BotaoMotif();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• QtWidgetFactory.java

class QtWidgetFactory extends WidgetFactory {

public Botao criarBotao() {

return new BotaoQt();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• Botao.java

abstract class Botao {

public abstract void desenhar();

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• BotaoMotif.java

class BotaoMotif extends Botao {

public void desenhar(){

System.out.println("Eu sou um botao Motif!");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• BotaoQt.java

class BotaoQt extends Botao {

public void desenhar(){

System.out.println("Eu sou um botao Qt!");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Código

• Client.java (Classe Executável)

public class Cliente {

public static void main(String[] args) {

WidgetFactory factory = WidgetFactory.obterFactory();

Botao botao = factory.criarBotao();

botao.desenhar();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Abstract Factory – Padrões Relacionados

• Factory Method

• Prototype

• Singleton

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

• Intenção:

– Definir uma interface (ou classe abstrata) para a criar

um objeto;

– Permitir a decisão de que implementações ou

subclasses devem ser instanciadas;

– Deixa uma classe deferir instanciação para subclasses

– Factory Method é conhecido como Virtual Constructor;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

• Motivação:

– Os frameworks usam classes abstratas para

definir e manter relacionamentos entre objetos;

• Considere um framework para

aplicações que podem apresentar

múltiplos documentos pra usuários;

• Duas abstrações chaves: – Application (aplicação) e Document (documento);

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

• Problema: – A classe Application não pode prever a subclasse de

Document a ser instanciada;

• Ou seja, ela não tem conhecimento sobre o

tipo do Document apenas sabe quando deve

ser criado;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

• Solução: – Usar o Factory Method que encapsula o conhecimento sobre a

subclasse de Document que deve ser criado movendo este

conhecimento para fora do framework;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Aplicabilidade

• Usar o padrão quando:

– Quando uma classe não pode antecipar ou conhecer a

classe dos objetos que deve criar;

– Quando uma classe quer que suas subclasses

especifiquem os objetos que criam;

– Quando classes delegam responsabilidade à alguma

das várias subclasses ajudantes, e deseja-se localizar

qual é a subclasse ajudante acessada.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method

• Colaborações para projeto:

– Uso da classe Creator que utiliza subclasses

para definir o seu método FactoryMethod

(método de fabricação) de maneira que retorne

um objeto ou instância do ConcretProduct

apropriado;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Consequências

• Vantagens:

– Elimina a necessidade de acoplar classes específicas para

aplicação em nível de código;

– Na programação, se lida apenas com a interface Product para

conhecer os métodos e atributos de uma forma genérica, o que

permite manipular as subclasses ou implementações de maneira

particular (ConcreteProduct).

– Fornece ganchos para classes

• Cria objetos através do método FactoryMethod

(métodos de fabricação);

• FactoryMethod possibilita as subclasses um gancho

para fornecer um versão estendida de um objeto;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Consequências

• Vantagens:

– Conecta hierarquias de classes paralelas

• Ocorrem quando uma classe delega alguma das

suas responsabilidades para uma classe separada;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Consequências

• Desvantagens:

– Os clientes podem ter que fornecer subclasses da classe Creator

somente para criar um objeto ConcreteProduct em particular;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Consequências

• Implementação (dicas) :

– Duas principais variações do padrão Factory Method:

• O Creator é uma classe abstrata e não fornece uma

implementação para método de fabricação (factory

method) que ela declara;

• O Creator é uma classe concreta e fornece uma

implementação por omissão para o método de

fabricação (factory method);

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Consequências

• Implementação (dicas) :

– Método de fabricação (factory method) parametrizados:

• O método de fabricação recebe um parâmetro que

identifica o objeto a ser criado;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Exemplo

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Código

• Aplicacao.java

abstract class Aplicacao {

private Documento doc;

//Abstração do Factory Method

abstract Documento criaDocumento();

void novoDocumento() {

this.doc = this.criaDocumento();

}

void abrirDocumento() {

this.doc.abrir();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Código

• MinhaAplicacao.java

class MinhaAplicacao extends Aplicacao {

/**

* Uma implementação do Factory Method. Este método é

* especializado na criação de documentos do tipo

* MeuDocumento

*/

@Override

Documento criaDocumento() {

return new MeuDocumento();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Código

• Documento.java

abstract class Documento {

void abrir() {

System.out.println("Documento:Abrir documento!");

}

void fechar() {

System.out.println("Documento:Fechar documento!");

}

void gravar() {

System.out.println("Documento:Gravar documento!");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Código

• MeuDocumento.java

class MeuDocumento extends Documento {

private String word = "Word";

private String excel = "Excel";

String getWord() {

return this.word;

}

String getExcel() {

return this.excel;

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Código

• FactoyMethodTest.java

public class FactoyMethodTest {

public static void main(String[] args) {

MinhaAplicacao aplicacao = new MinhaAplicacao();

Documento docu = aplicacao.criaDocumento();

docu.abrir();

MeuDocumento documento = new MeuDocumento();

System.out.println("Documento: " + documento.getWord());

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Padrões Relacionados

• Abstract Factory

• Template Method

• Prototype

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Código

• Análise do código:

– O que podemos melhorar e há alguma coisa errada com código?

– Falta alguma classe ser implementada?

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Factory Method – Exercício

1. Implemente a aplicação mostrada na figura abaixo

usando Factory Method para criar os objetos.

1. Crie um objeto construtor para cada tipo de objeto (XXXFactory

para criar figuras do tipo XXX)

2. Utilize a fachada Figura, onde os construtores são guardados, e

um método estático que seleciona o construtor desejado com

uma chave.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton

• Intenção:

– Garantir que uma classe tenha somente uma

instância e fornecer um ponto global de acesso

para a mesma;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton

• Motivação:

– Em muitas aplicações necessitamos garantir a

ocorrência de apenas uma instância de classes, pois

tais objetos podem fazer uso de recursos cuja

utilização deve ser exclusiva, ou porque se deseja que

os demais elementos do sistema compartilhem um

único objeto particular.

Ex.: Um filtro digital terá somente um conversor A/D;

Um sistema de contabilidades será dedicado somente

a uma companhia;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton

• Problema: – Como garantir que uma classe tenha somente

um instância e que essa instância seja

facilmente acessível?

– Uma variável global torna um objeto acessível,

mas não impede você de instanciar múltiplos

objetos;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton

• Solução:

– Tornar a própria classe responsável por

manter o controle da sua única instancia;

– A classe pode garantir que nenhuma outra

instância seja criada e fornecer um meio para

acessar sua única instância;

– Padrão Singleton;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Aplicabilidade

• Usar o padrão quando:

– Deve haver uma única instância de uma classe

e esta deve ser acessada a partir de um ponto

de acesso bem conhecido.

– A instância única deve ser extensível através

de subclasses, possibilitando aos clientes usar

instância estendida sem alterar o seu código;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Estrutura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton

• Colaborações para projeto:

– Os clientes acessam uma instância Singleton

unicamente pela operação Instance do

Singleton;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Consequências

• Vantagens:

– Acesso controlado à instância única;

– O Singleton tem controle sobre como e quando

clientes acessam a instância;

– Espaço de nomes reduzido;

• O Singleton é melhor que variáveis globais, já que

as “globais” podem ser encapsuladas na instância

única, deixando um único nome externo visível;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Consequências

• Vantagens:

– Permite refinamento de operações e de

representação;

• Várias classes Singleton (relacionadas ou não via

herança) podem obedecer a mesma interface,

permitindo que um Singleton particular seja

escolhido para trabalhar com uma determinada

aplicação em tempo de execução;

– Mais flexível que métodos estáticos;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Implementação (Dicas)

• Garantir uma única instância;

– Ocultando a operação que cria a instância usando um

operação de classe (isto é, uma função-membro

estática ou um método de classe);

• Criar subclasses da classe Singleton;

– A variável que referencia a instância do Singleton deve

ser iniciada com uma instância da subclasse;

• Retira-se a implementação da Instance da

classe-mãe e colocá-la na subclasse;

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Implementação (Dicas)

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Implementação (Dicas)

• Singleton.java public class Singleton {

private static Singleton instance = new Singleton();

int x;

String msg;

private Singleton() {

this.x = (int) (10 * Math.random());

this.msg = "-- A classe foi instanciada criando um Objeto

Singleton.\n" +

"\t # x inicializado com o valor inteiro: " + String.valueOf(this.x);

System.out.println(this.msg);

}

public static synchronized Singleton getInstance() {

if (instance == null)

instance = new Singleton();

return instance;

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Singleton – Implementação (Dicas)

• SingletonTest.java

public class SingletonTest {

public static void main(String args[]) {

Singleton concreteSing = null;

concreteSing = concreteSing.getInstance();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder

• Intenção:

– Propõe que o processo de construção de um objeto, quando

complexo, seja separado da definição do objeto, para que

possamos ter diferentes algoritmos de construção permitindo

diferentes representações para o objeto.

– Devemos lembrar desde já que Factory Method e Abstract Factory

são padrões que trabalham na criação de objetos de uma família

de classes, trabalhando intensamente com polimorfismo,

enquanto o Builder tem o foco nos detalhes de construção de uma

instância de objeto, que não necessariamente terá uma família de

subclasses.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Estrutura

• Builder - Especifica a interface para criação de um objeto produto.

• ConcreteBuilder - São as implementações de Builder.

• Director - Classe que sabe o algoritmo de construção do objeto.

• Product - Representa o objeto-produto final.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Antipattern

• O que é?

– É um padrão de projeto de software que pode ser

comumente usado mas é ineficiente e/ou contra-

produtivo em prática

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Antipattern

• Imaginemos uma situação onde precisamos construir

diferentes tipos de computadores com diferentes

componentes: servidor, computador para games e

computador básico.

• Poderíamos criar métodos em classes aleatórias que

criam os computadores porém as diferentes lógicas de

criação do computador ficariam espalhadas pelo código.

• O padrão Builder visa organizar justamente os processos

de criação de objetos complexos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Aplicação

class builder2

ComputadorBasicoBuilder

+ createComputador() : void

+ addPlacaMae() : void

+ addHardDisks() : void

ComputadorBuilder

# computador: Computador

+ createComputador() : void

+ addPlacaMae() : void

+ addHardDisks() : void

+ getComputador() : Computador

ComputadorDirector

~ builder: ComputadorBuilder

+ ComputadorDirector(ComputadorBuilder)

+ buildComputador() : Computador

ComputadorGamesBuilder

+ createComputador() : void

+ addPlacaMae() : void

+ addHardDisks() : void

Serv idorBuilder

+ createComputador() : void

+ addPlacaMae() : void

+ addHardDisks() : void

~builder

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Exemplo

• Conversor de Texto:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Exemplo

• Conversor de Texto:

– Neste exemplo, o método lerRTF() (classe LeitorRTF) percorre uma lista

com os tokens encontrados no texto de entrada (formato RTF) e, para

cada tipo de token, chama um método do objeto de tipoConversorTexto.

– Dependendo do formato escolhido para o texto de destino, será escolhida

uma implementação da

classe ConversorTexto: ConversorPDF, ConversorTeX ou ConversorASC

II.

– Cada uma destas classes implementa os métodos de acordo com as

características do formato relacionado.

– A classe ConversorASCII não implementa os

métodos converteParagrafo() e converteFonte() pois este formato (ASCII)

não possui elementos de estilo.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Código

• ConversorTexto.java

abstract class ConversorTexto {

void converterCaractere(char c) {}

void converterParagrafo() {}

void converterFonte(Fonte f) {}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Código

• ConversorPDF.java

class ConversorPDF extends ConversorTexto {

void converterCaractere(char c) {

System.out.println("Caractere PDF");

}

void converterParagrafo() {

System.out.println("Paragrafo PDF");

}

void converterFonte(Fonte f) {

System.out.println("Fonte PDF");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Código

• ConversorTeX.java

class ConversorTeX extends ConversorTexto {

void converterCaractere(char c) {

System.out.println("Caractere TeX");

}

void converterParagrafo() {

System.out.println("Paragrafo TeX");

}

void converterFonte(Fonte f) {

System.out.println("Fonte TeX");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Código

• ConversorASCII.java

class ConversorASCII extends ConversorTexto {

void converterCaractere(char c) {

System.out.println("Caractere ASCII");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Código

• LeitorRTF.java class LeitorRTF {

private ConversorTexto conversor;

LeitorRTF(ConversorTexto c) {

this.conversor = c;

}

public void lerRTF() {

List<Token> tokens = obterTokensDoTexto();

for (Token t : tokens) {

if (t.getTipo() == Token.Tipo.CARACTERE){

conversor.converterCaractere(t.getCaractere());

}

if (t.getTipo() == Token.Tipo.PARAGRAFO) {

conversor.converterParagrafo();

}

if (t.getTipo() == Token.Tipo.FONTE) {

conversor.converterFonte(t.getFonte());

}

}

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Builder – Código

• Cliente.java public class Cliente {

public static void main(String[] args) {

ConversorTexto conversor;

if (args[0].equals("pdf")) {

conversor = new ConversorPDF();

} else if (args[0].equals("tex")) {

conversor = new ConversorTeX();

} else {

conversor = new ConversorASCII();

}

LeitorRTF leitor = new LeitorRTF(conversor);

leitor.lerRTF();

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Apresentação:

– Especifica os tipos de objetos a criar usando

uma instância de protótipo, criando-os

mediante cópia (ou clonagem) deste protótipo.

– Esta operação é realizada sem que a

aplicação saiba qual classe específica está

sendo instanciada.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Aplicabilidade:

– Em situações nas quais deve-se criar

instâncias de objetos a partir de hierarquias de

classes complexas e quando a classe de um

objeto é conhecida somente em tempo de

execução são exemplos do uso deste padrão

de projeto.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Estrutura:

– Prototype: Uma classe que declara uma interface

para objetos capazes de clonar a si mesmo.

– PrototypeConcreto(1,2,...): Implementação de um

prototype;

– Cliente: Cria um novo objeto através de um prototype

que é capaz de clonar a si mesmo.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Descrição:

– A utilização deste padrão de projeto dá-se pela

existência de uma classe base (ou interface)

contendo a declaração do método clone() e,

dependendo da implementação, mantém um

coleção (na forma de um dicionário, por

exemplo) de classes concretas derivadas da

classe base (ou que implementem a interface).

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Exemplo na API Java:

– Este padrão de projeto é a essência da

especificação JavaBean. A interface java.lang.Cloneable existe para que

classes a implementem, e, assim, atestem que

podem ser clonadas, mediante a sobre-escrita do método clone(), disponível na classe

java.lang.Object.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Observações:

– Eventualmente, padrões de projeto de criação

competem entre si em uso.

– Às vezes pode-se utilizar ou o padrão de

projeto Prototype ou Abstract Factory.

– Enquanto em outros casos, ambos são

complementos um do outro.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Padrões Relacionados

– Abstract Factory, Composite e Decorator.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Anti-Pattern

– O uso deste padrão de projeto destina-se a criar

cópias (clones) a partir de uma instância denominada

protótipo.

– Assim, o seu anti-pattern é a situação na qual toda vez

que uma cópia de um determinado objeto é necessária

sua criação deve ser realizada, comprometendo,

possivelmente, o desempenho da aplicação e a

quantidade de memória para comportar um número

elevado de objetos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Exemplo:

– Neste exemplo é mostrado uma hierarquia de classes

representando documentos de

formato ASCII e PDF que são criados através da classe Cliente.

– A partir de duas instâncias prototípicas, ascii e pdf,

o método criarDocumento cria clones de

documentos de acordo com o tipo desejado.

– A tarefa de realizar a criação da instância é

implementada na classe Documento e herdada por

suas classes filhas, ASCII ePDF.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype

• Exemplo:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype - Código

• Icloneable.java:

public interface ICloneable {

public void clone();

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype - Código

• Documento.java:

abstract class Documento implements ICloneable {

protected Documento clone() {

Object clone = null;

try {

clone = super.clone();

} catch (CloneNotSupportedException ex) {

ex.printStackTrace();

}

return (Documento) clone;

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype - Código

• ASCII.java:

class ASCII extends Documento {

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype - Código

• PDF.java:

class PDF extends Documento {

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Prototype - Código

• Cliente.java:

class Cliente {

static final int DOCUMENTO_TIPO_ASCII = 0;

static final int DOCUMENTO_TIPO_PDF = 1;

private Documento ascii = new ASCII();

private Documento pdf = new PDF();

public Documento criarDocumento(int tipo) {

if (tipo == Cliente.DOCUMENTO_TIPO_ASCII) {

return ascii.clone();

} else {

return pdf.clone();

}

}

}

Padrões Estruturais

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões Estruturais

• Os padrões estruturais vão se preocupar em como as

classes e objetos são compostos, ou seja, como é a sua

estrutura.

• O objetivo destes padrões e facilitar o design do sistema

identificando maneiras de realizar o relacionamento entre

as entidades, deixando o desenvolvedor livre desta

preocupação.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões Estruturais

• Os padrões com escopo de classe utilizam a herança

para compor implementações ou interfaces.

• O padrão Adapter, por exemplo, pode definir uma nova

interface para adaptar duas outras já existentes, assim

uma nova classe é criada para adaptar uma interface a

outra. Os padrões com escopo de objeto utilizam a

composição de objetos para definir uma estrutura.

• Por exemplo, o padrão Composite define

(explicitamente) uma estrutura de hierárquica para

classes primitivas e compostas em um objeto.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões Estruturais

• Adapter

• Bridge

• Composite

• Decorator

• Façade

• Flyweight

• Proxy

Padrões Comportamentais

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões Comportamentais

• Os padrões comportamentais atuam sobre como

responsabilidades são atribuídas as entidades, ou seja,

qual o comportamento das entidades.

• Estes padrões facilitam a comunicação entre os objetos,

distribuindo as responsabilidades e definindo a

comunicação interna.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões Comportamentais

• Padrões com escopo de classe utilizam herança para

realizar a distribuição do comportamento.

• Um bom exemplo é o padrão Template Method, que

fornece um algoritmo (comportamento) padrão e deixa as

subclasses definirem alguns pontos da execução do

algoritmo.

• Já os padrões de objetos vão compor os objetos para

definir a comunicação, como o padrão Mediator, que

define um objeto que realiza a comunicação muitos-para-

muitos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Padrões Comportamentais

• Chain of Responsibility

• Command

• Interpreter

• Iterator

• Mediator

• Memento

• Observer

• State

• Strategy

• Template Method

• Visitor

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

• Apresentação:

• Normalmente, este padrão de projeto é utilizado em

situações nas quais se deseja que mais de um objeto

possa tratar (manipular) um pedido (requisição), evitando

o acoplamento entre o remetente de um pedido e o seu

destinatário.

• Assim, os objetos recebedores são encadeados e o

pedido é passado por este encadeamento até que um

objeto o trate.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

• Aplicabilidade:

• Este padrão de projeto é comumente utilizando quando

mais de um objeto é capaz de tratar um pedido e o mesmo

não é conhecido antecipadamente.

• O objeto tratador do pedido deve ser reconhecido

automaticamente.

• Um pedido deve ser tratado por um entre vários objetos

sem que o objeto tratador seja especificado explicitamente.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

• Estrutura:

• Cada objeto no encadeamento (ConcreteHandlerA,

ConcreteHandlerB) age como um tratador de pedidos

e conhece seu sucessor.

• Se um dado objeto é capaz de tratar o pedido ele o faz,

caso contrário o pedido é passado ao próximo tratador no

encadeamento de objetos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

• Exemplo:

• Uma aplicação de e-commerce precisa se comunicar com

vários bancos diferentes para prover aos seus usuários

mais possibilidades de pagamentos, atingindo assim um

número maior de usuários e facilitando suas vidas.

• Ao modelar uma forma de execução do pagamento, dado

que precisamos selecionar um entre vários tipos de

bancos, a primeira ideia que surge é utilizar uma estrutura

de decisão para verificar, dado um parâmetro, qual o

banco correto deve ser utilizado.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility

• Exemplo:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility – Código

• IDBancos.java:

public enum IDBancos {

bancoA, bancoB, bancoC, bancoD

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility – Código

• BancoChain.java:

public abstract class BancoChain {

protected BancoChain next;

protected IDBancos identificadorDoBanco;

public BancoChain(IDBancos id) {

next = null;

identificadorDoBanco = id;

}

public void setNext(BancoChain forma) {

if (next == null) {

next = forma;

} else {

next.setNext(forma);

}

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility – Código

• BancoChain.java:

public void efetuarPagamento(IDBancos id) throws Exception {

if (podeEfetuarPagamento(id)) {

efetuaPagamento();

} else {

if (next == null) {

throw new Exception("banco não cadastrado");

}

next.efetuarPagamento(id);

}

}

private boolean podeEfetuarPagamento(IDBancos id) {

if (identificadorDoBanco == id) {

return true;

}

return false;

}

protected abstract void efetuaPagamento();

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility – Código

• BancoA.java:

public class BancoA extends BancoChain {

public BancoA() {

super(IDBancos.bancoA);

}

@Override

protected void efetuaPagamento() {

System.out.println("Pagamento efetuado no banco A");

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Chain of Responsibility – Código

• Client.java:

public class Client {

public static void main(String[] args) {

BancoChain bancos = new BancoA();

bancos.setNext(new BancoB());

bancos.setNext(new BancoC());

bancos.setNext(new BancoD());

try {

bancos.efetuarPagamento(IDBancos.bancoC);

bancos.efetuarPagamento(IDBancos.bancoD);

bancos.efetuarPagamento(IDBancos.bancoA);

bancos.efetuarPagamento(IDBancos.bancoB);

} catch (Exception e) {

e.printStackTrace();

}

}}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Apresentação:

• Este padrão de projeto representa comandos como

objetos.

• Isto possibilita realizar requisições a objetos sem o

conhecimento de como a operação é executada ou o

destinatário (receiver) da requisição.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Aplicabilidade:

• Objetos podem ser parametrizados pela ação a executar,

como, por exemplo, uma opção de menu ou um botão em

uma barra de ferramentas.

• Opcionalmente, um comando pode especificar uma

operação de desfazer (undo), permitindo reverter os efeitos no próprio comando. Assim, a interface Command

deve declarar uma operação (método) – undo() – para

realizar tal operação.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Aplicabilidade:

• Neste caso, as ações realizadas por execute() são

armazenadas em uma lista de histórico e o nível de

execuções e reversões pode ser ilimitado simplesmente

percorrendo a lista de histórico do fim para o início ou do

início para fim.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código

• Loja.java:

public class Loja {

protected String nomeDaLoja;

public Loja(String nome) {

nomeDaLoja = nome;

}

public void executarCompra(double valor) {

Compra compra = new Compra(nomeDaLoja);

compra.setValor(valor);

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código

• Exemplo:

• Sistema de Pagamento de Loja

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código

• Loja.java:

public class Compra {

private static int CONTADOR_ID;

protected int idNotaFiscal;

protected String nomeDaLoja;

protected double valorTotal;

public Compra(String nomeDaLoja) {

this.nomeDaLoja = nomeDaLoja;

idNotaFiscal = ++CONTADOR_ID;

}

public void setValor(double valor) {

this.valorTotal = valor;

}

public String getInfoNota() {

return new String("Nota fiscal nº: " + idNotaFiscal + "\nLoja: "

+ nomeDaLoja + "\nValor: " + valorTotal);

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código – ANTI-PATTERN!!!

• Loja.java:

public void executarCompra(double valor, FormaDePagamento frmPag){

Compra compra = new Compra(nomeDaLoja);

compra.setValor(valor);

if(frmPag == FormaDePagamento.CartaoDeCredito){

new PagamentoCartaoCredito().processarCompra(compra);

} else if(frmPag == FormaDePagamento.CartaoDeDebito){

new PagamentoCartaoDebito().processarCompra(compra);

} else if(frmPag == FormaDePagamento.Boleto){

new PagamentoBoleto().processarCompra(compra);

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código

• Agora, aplicando o padrão!

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Exemplo:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código

• PagamentoCommand.java:

public interface PagamentoCommand {

void processarCompra(Compra compra);

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código

• PagamentoBoleto.java:

public class PagamentoBoleto implements PagamentoCommand {

@Override

public void processarCompra(Compra compra) {

System.out.println("Boleto criado!\n" + compra.getInfoNota());

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command – Código – Usando o Padrão!

• Loja.java:

public void executarCompra(double valor, PagamentoCommand frmPag) {

Compra compra = new Compra(nomeDaLoja);

compra.setValor(valor);

frmPag.processarCompra(compra);

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Observação:

• O padrão tem um conceito muito simples, utiliza-

se apenas da herança para agrupar classes e

obrigar que todas tenham uma mesma interface

em comum.

• A primeira vista o padrão pode ser confundido

com o padrão Template Method, pois ambos

utilizam a herança para unificar a interface de

várias classes.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Command

• Observação:

• A diferença básica é que no padrão Command

não existe a ideia de um “algoritmo” que será

executado.

• No padrão Template Method as subclasses

definem apenas algumas operações, sem alterar o

esqueleto de execução.

• O padrão Command não oferece uma maneira de

execução de suas subclasses, apenas garante que

todas executem determinada requisição.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Apresentação:

• Padrão de projeto utilizado para modelar a gramática para

uma linguagem específica a um domínio de problemas.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Aplicabilidade:

• Analisadores de expressões regulares, expressões

algébricas e partituras musicais (um dado som e sua

duração), além de linguagens de consulta (query

language) e protocolos de comunicação são exemplos da

aplicabilidade deste padrão de projeto.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Descrição:

• AbstractExpression declara a operação comum a

todos os elementos na árvore de sintaxe abstrata, enquanto TerminalExpression implementa tal

operação para um determinado elemento terminal (que

não pode ser definido em termos de outros elementos).

• NonterminalExpression implementa a mesma

operação de forma que esta possa ser chamada

recursivamente para cada símbolo na gramática e Context possui a informação que é global ao

interpretador.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Descrição:

• Como exemplo, tem-se, a seguir, a gramática que define expressões

regulares:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Exemplo:

• Sistema de Conversão de Algarismos Romanos

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter

• Exemplo:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter – Código

• Contexto.java:

public class Contexto {

protected String input;

protected int output;

public Contexto(String input) {

this.input = input;

}

public String getInput() {

return input;

}

public void setInput(String input) {

this.input = input;

}

public int getOutput() {

return output;

}

public void setOutput(int output) {

this.output = output;

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter – Código

• NumeroRomanoInterpreter.java:

public abstract class NumeroRomanoInterpreter {

public void interpretar(Contexto contexto) {

if (contexto.getInput().length() == 0) {

return;

}

// Os valores nove e quatro são os únicos que possuem duas casas

// Ex: IV, IX

if (contexto.getInput().startsWith(nove())) {

adicionarValorOutput(contexto, 9);

consumirDuasCasasDoInput(contexto);

} else if (contexto.getInput().startsWith(quatro())) {

adicionarValorOutput(contexto, 4);

consumirDuasCasasDoInput(contexto);

} else if (contexto.getInput().startsWith(cinco())) {

adicionarValorOutput(contexto, 5);

consumirUmaCasaInput(contexto);

}

// Os valores de um são os únicos que repetem, ex: III, CCC, MMM

while (contexto.getInput().startsWith(um())) {

adicionarValorOutput(contexto, 1);

consumirUmaCasaInput(contexto);

}

}

private void consumirUmaCasaInput(Contexto contexto) {

contexto.setInput(contexto.getInput().substring(1));

}

private void consumirDuasCasasDoInput(Contexto contexto) {

contexto.setInput(contexto.getInput().substring(2));

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter – Código

• NumeroRomanoInterpreter.java:

public abstract class NumeroRomanoInterpreter {

...

public abstract String um();

public abstract String quatro();

public abstract String cinco();

public abstract String nove();

public abstract int multiplicador();

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter – Código

• UmDigitoRomano.java:

public class UmDigitoRomano extends NumeroRomanoInterpreter {

@Override

public String um() {

return "I";

}

@Override

public String quatro() {

return "IV";

}

@Override

public String cinco() {

return "V";

}

@Override

public String nove() {

return "IX";

}

@Override

public int multiplicador() {

return 1;

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter – Código

• DoisDigitoRomano.java:

public class DoisDigitosRomano extends NumeroRomanoInterpreter {

@Override

public String um() {

return "X";

}

@Override

public String quatro() {

return "XL";

}

@Override

public String cinco() {

return "L";

}

@Override

public String nove() {

return "XC";

}

@Override

public int multiplicador() {

return 10;

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Interpreter – Código

• Cliente.java:

public static void main(String[] args) {

ArrayList interpretadores = new ArrayList();

interpretadores.add(new QuatroDigitosRomano());

interpretadores.add(new TresDigitosRomano());

interpretadores.add(new DoisDigitosRomano());

interpretadores.add(new UmDigitoRomano());

String numRomano = "CXCIV";

Contexto contexto = new Contexto(numeroRomano);

for (NumeroRomanoInterpreter numRomInterpreter : interpretadores) {

numRomInterpreter.interpretar(contexto);

}

System.out.println(numRomano+"="+Integer.toString(contexto.getOutput()));

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator

• Apresentação:

• Este padrão de projeto fornece uma interface comum

para que uma coleção de objetos possa ser percorrida

sem, no entanto, que a aplicação tome conhecimento de

como tais objetos estão agrupados.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator

• Aplicabilidade:

• A utilização deste padrão de projeto possibilita à

aplicação ter acesso ao conteúdo de um objeto agregado

sem que sua representação interna seja exposta.

• A coleção de objetos pode ser percorrida em ambas as

direções, de acordo com a declaração da interface.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator

• Descrição:

• Collection é a interface comum que disponibiliza a

assinatura do método createIterator(), entre outros,

que deve ser implementado pelas classes descendentes

e cujas implementações permitem o percorrimento da

coleção de objetos (agregado).

• Assim, cada coleção concreta implementa o algoritmo de

percorrimento de acordo com a representação de seus

dados, retornando à aplicação uma referência à interface Iterator, que apresenta uma interface comum utilizada

para percorrer da coleção de objetos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator

• Exemplo:

• Exibir lista de canais de tv por assinatura

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• Representação Simples:

ArrayList<Canal> arrayListDeCanais = new ArrayList<Canal>();

Canal[] matrizDeCanais = new Canal[5];

for (Canal canal : arrayListDeCanais) {

System.out.println(canal.nome);

}

for (int i = 0; i < matrizDeCanais.length; i++) {

System.out.println(matrizDeCanais[i].nome);

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• Usando o Padrão:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• AgregadoDeCanais.java:

public interface AgregadoDeCanais {

IteradorInterface criarIterator();

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• CanaisEsportes.java:

public class CanaisEsportes implements AgregadoDeCanais {

protected ArrayList<Canal> canais;

public CanaisEsportes() {

canais = new ArrayList<Canal>();

canais.add(new Canal("Esporte ao vivo"));

canais.add(new Canal("Basquete 2011"));

canais.add(new Canal("Campeonato Italiano"));

canais.add(new Canal("Campeonato Espanhol"));

canais.add(new Canal("Campeonato Brasileiro"));

}

@Override

public IteradorListaDeCanais criarIterator() {

return new IteradorListaDeCanais(canais);

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• Classe que utilizar Matriz:

@Override

public IteradorInterface criarIterator() {

return new IteradorMatrizDeCanais(canais);

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• IteradorInterface.java:

public interface IteradorInterface {

void first();

void next();

boolean isDone();

Canal currentItem();

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• IteradorListaDeCanais.java:

public class IteradorListaDeCanais implements IteradorInterface {

protected ArrayList<Canal> lista;

protected int contador;

protected IteradorListaDeCanais(ArrayList<Canal> lista) {

this.lista = lista;

contador = 0;

}

public void first() {

contador = 0;

}

public void next() {

contador++;

}

public boolean isDone() {

return contador == lista.size();

}

public Canal currentItem() {

if (isDone()) {

contador = lista.size() - 1;

} else if (contador < 0) {

contador = 0;

}

return lista.get(contador);

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• IteradorListaDeCanais.java:

public class IteradorMatrizDeCanais implements IteradorInterface {

protected Canal[] lista;

protected int contador;

public IteradorMatrizDeCanais(Canal[] lista) {

this.lista = lista;

}

@Override

public void first() {

contador = 0;

}

@Override

public void next() {

contador++;

}

@Override

public boolean isDone() {

return contador == lista.length;

}

@Override

public Canal currentItem() {

if (isDone()) {

contador = lista.length - 1;

} else if (contador < 0) {

contador = 0;

}

return lista[contador];

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Iterator – Código

• Cliente.java:

public static void main(String[] args) {

AgregadoDeCanais canaisDeEsportes = new CanaisEsportes();

System.out.println("Canais de Esporte:");

for (IteradorInterface it = canaisDeEsportes.criarIterator(); !it.isDone();

it.next()){

System.out.println(it.currentItem().nome);

}

AgregadoDeCanais canaisDeFilmes = new CanaisFilmes();

System.out.println("\nCanais de Filmes:");

for (IteradorInterface it = canaisDeFilmes.criarIterator(); !it.isDone();

it.next()) {

System.out.println(it.currentItem().nome);

}

}

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Mediator

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Mediator

• Apresentação:

• Este padrão de projeto provê uma interface unificada a

um conjunto de interfaces em um subsistema, fazendo

com que a comunicação entre os vários objetos do

subsistema seja realizada por um objeto. Desta forma, os

objetos do subsistema deixam de manter relações entre

si, reduzindo, assim, o acoplamento.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Mediator

• Aplicabilidade:

• A aplicabilidade para este padrão de projeto dá-se

quando se quer separar a comunicação que vários

objetos têm entre si através de uma interface bem

definida, diminuindo, assim, suas interdependências.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Mediator

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Mediator

• Descrição:

• Objetos Colleague são desacoplados uns dos outros.

• As classes concretas de Colleague “conversam” com a

implementação concreta de Mediator, que, por sua vez,

conduz a troca de mensagens entre objetos Colleague.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Mediator

• Exemplo:

• Sistema de troca de mensagens entre celulares de

diferentes SOs

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Memento

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Memento

• Apresentação:

• Este padrão de projeto baseia-se em dois objetos: o objeto Originator e o objeto Caretaker.

• O primeiro é qualquer objeto da aplicação, enquanto o

segundo necessita realizar algum processamento no primeiro,

mas precisa que o estado inicial possa ser restaurado.

• Desta forma, o conceito de encapsulamento não é violado, o

que, de outra forma, exporia à aplicação os detalhes de

implementação do objeto que sofrerá o processamento.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Memento

• Aplicabilidade:

• Quando se deseja realizar algum processamento

temporário em determinado objeto da aplicação, o padrão

de projeto Memento é aplicado de tal forma que um

“instantâneo” (snapshot) do estado (ou de parte deste) do

objeto em questão seja salvo para ser restaurado

posteriormente ao processamento realizado.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Memento

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Memento

• Descrição:

• O objeto Caretaker deve realizar algum processamento

com o objeto Originator, possivelmente mudando seu

estado.

• Antes que isto aconteça, o objeto Caretaker pede ao

objeto Originator por uma referência a Memento,

realiza o processamento desejado e devolve a referência Memento ao objeto Originator para que seu estado

seja restaurado.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Memento

• Exemplo:

• Editor de texto, com recurso de recuperação de estados

anteriores ao atual.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Apresentação:

• O objetivo deste padrão de projeto é definir uma relação

de dependência de um para muitos entre um conjunto de

objetos.

• Desta forma, quando um objeto muda de estado todos

seus dependentes são notificados de tal mudança.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Apresentação:

• De outra forma, se pode dizer que um ou mais objetos,

denominados observadores (observers) ou ouvintes

(listeners) são registrados (ou se registram) para

observervar um determinado evento que pode acontecer

por meio de um objeto observado (subject).

• Normalmente, este objeto observado mantém uma

coleção de observadores.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Aplicabilidade:

• Este padrão de projeto é utilizado quando se deseja

observar um evento externo, tal como, uma ação do

usuário, o que é muito empregado em programação

orientada a eventos.

• Mudanças no valor de propriedades (variáveis) também

empregam o uso deste padrão de projeto.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Aplicabilidade:

• A arquitetura Modelo-Visão-Controlador (MVC – Model-

View-Controller) faz uso freqüente deste padrão, pois ele

é empregado de forma a criar um baixo acoplamento

entre o Modelo e a Visão fazendo com que uma mudança

no Modelo alerte os seus observadores, que são, neste

caso, as visões.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Descrição:

• A classe Subject é utilizada por classes concretas como

interface comum para que objetos possam se registrar como

observadores, bem como para que possam ser removidos,

sendo que cada classe concreta pode ter uma coleção de

observadores.

• Qualquer classe pode ser um observador desde que implemente a interface Observer e se registre com uma

classe concreta de Subject. Assim, os observadores serão

notificados sempre que o estado da classe concreta de Subject que os tenha registrado mude.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Observer

• Exemplo:

• Representação de dados, em diversos formatos (Tabela,

Porcentagem, Gráfico Barras, Etc.)

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Apresentação:

• Este padrão de projeto permite que um objeto modifique

seu comportamento de acordo com a mudança de seu

estado interno.

• Assim, tem-se a impressão que o objeto muda sua classe.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Aplicabilidade:

• O uso deste padrão de projeto dá-se quando o

comportamento de um objeto depende de seu estado e

este comportamento deve se modificar em tempo de

execução (runtime) de acordo com este estado e,

também, quando muitas declarações condicionais (if-

else-if-else) dependem do estado do objeto.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Aplicabilidade (Cont). :

• Neste caso, cada operação, que é realizada de acordo

com um valor constante, deve ser transferida para uma

classe própria.

• Esta transferência permite tratar o estado do objeto como

um objeto por si só.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Descrição:

• Context pode ser qualquer classe na aplicação que

contém vários estados internos.

• Quando o método request() é invocado sobre o objeto

contexto, o processamento é delegado ao objeto estado (State).

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Descrição (Cont.):

• Assim, os estados concretos (ConcreteStateA,

ConcreteStateB) tratam (manipulam) as requisições

provenientes do contexto e os estados concretos têm

suas próprias implementações para o tratamento da

requisição.

• Desta forma, quando Context muda seu estado (o(s)

valor(es) de seu(s) atributo(s) é(são) alterado(s)), seu

comportamento também muda.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

State

• Exemplo:

• Gerenciar os vários estados de um personagens de

game. (Ex: Mario)

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Apresentação :

• Este padrão de projeto define uma família de algoritmos,

os encapsula e os torna intercambiáveis.

• Estes algoritmos podem variar independente da aplicação

cliente que os usa.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Aplicabilidade:

• Este padrão de projeto provê uma forma de configurar

uma classe com um de vários comportamentos ou

algoritmos.

• Além disto, é possível esconder da aplicação as

estruturas de dados, possivelmente complexas, utilizadas

pelos diversos algoritmos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Aplicabilidade (Cont.):

• Isto permite que diferentes regras de negócios possam

ser utilizadas dependendo do contexto no qual elas

ocorram, significando que este padrão de projeto fornece

um meio de configurar uma classe com um entre vários

comportamentos.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Descrição:

• Encapsula algoritmos em classes, permitindo que eles

possam variar independente da aplicação cliente que os

usa. Isto possibilita a aplicação do princípio denominado

Princípio Aberto-Fechado (Open-Closed Principle), no

qual uma classe está aberta para extensões enquanto

mantém-se fechado para alterações.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Descrição (Cont.):

• Tal princípio é alcançado pelo uso deste padrão de

projeto, pois a aplicação cliente faz uso de uma classe

base (classe abstrata ou interface) e os detalhes de

implementação estão presentes em classes derivadas.

• A aplicação cliente não sofre impacto no caso do

aumento de classes derivadas, nem tampouco com

eventuais mudanças que essas classes venham a sofrer.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Descrição (Cont.):

• Com isto, a aplicação cliente minimiza o acoplamento,

pois mantém um vínculo com a abstração (classe abstrata

ou interface) e não com uma implementação específica.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Strategy

• Exemplo:

• Cálculo de impostos de acordo com o cargo do

funcionário.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Apresentação:

• Padrão de projeto cuja função é generalizar um processo,

em um nível mais genérico, em um conjunto de passos,

permitindo que etapas comuns sejam implementadas e

que etapas específicas tenham suas implementações

realizadas por classes descendentes.

• Em outras palavras, este padrão permite que subclasses

de uma classe comum possam variar partes de um

algoritmo mais geral.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Aplicabilidade:

• Partes de um algoritmo genérico são implementadas em

uma classe comum a partir da qual suas subclasses

podem ou devem implementar as partes específicas.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Descrição:

• A classe AbstractClass possui o método

templateMethod() e as assinaturas de métodos

abstratos, usados pelo método template, que devem ser

implementados por classes descendentes.

• Uma vez que a classe contendo o método com os passos

comuns (ou genéricos) tenha sido criada, várias classes

concretas podem existir, cada uma implementando as

partes específicas do algoritmo.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Descrição (Cont.):

• Algumas vezes um algoritmo genérico pode-se valer de

passos que, se não implementados por classes

descendentes, podem não existir ou são padronizados.

• Neste caso, as classes descendentes podem escolher ou

não realizar suas implementações.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Descrição (Cont.):

• Outras vezes, dependendo do projeto, AbstractClass

pode ser, na verdade, uma classe concreta, cujos passos

específicos de um algoritmo podem ou devem ser

implementadas por classes descendentes.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Template Method

• Exemplo:

• Ordenação de uma Playlist de MP3

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

• Apresentação:

• Representa uma operação que é executada em uma

estrutura de objetos.

• Novas operações são definidas sem, no entanto,

conhecer as classes dos objetos sobre as quais elas

serão executadas.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

• Aplicabilidade:

• Este padrão de projeto pode ser utilizado quando uma

estrutura de objetos contém muitas classes com

interfaces diferentes e se deseja executar operações

distintas ou sem relação entre si.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

• Aplicabilidade (Cont.):

• Isto evita a “poluição” de código e mantém códigos

relacionados em uma única classe.

• Além disto, normalmente a frequência de mudanças nas

estruturas de objetos é pequena, enquanto que novas

operações podem ser acrescentadas à medida que os

requisitos se modificam.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

• Estrutura:

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

• Descrição:

• Este padrão de projeto é aplicado quando há necessidade

de se executar operações semelhantes em objetos de

diferentes tipos agrupados em uma estrutura,

possivelmente uma coleção.

• Ele também fornece um meio prático para o acréscimo de

novos visitors que estendem funcionalidades pré-

existentes sem que o código seja modificado.

Unidade 2 – Padrões GoF

Padrões de Projetos de Software

Visitor

• Exemplo:

• Representação de Árvore Binária