0% acharam este documento útil (0 voto)
340 visualizações96 páginas

Livro 04 - Padrões GOF

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
340 visualizações96 páginas

Livro 04 - Padrões GOF

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Padrões de Projeto

LIVRO 04
Padrões Gang of Four
Sumário
1. Padrões Gang of Four 4. Padrões GoF comportamentais
2. Padrões GoF de criação Chain of responsability
Command
Abstract Factory
Iterator
Builder
Mediator
Prototype
Memento
Singleton
Observer
3. Padrões GoF estruturais State
Strategy
Object Adapter
Visitor
Bridge
Composite 5. Referências
Decorator
Facade
Flyweight
Proxy
Padrões Gang of Four Frameworks

Atualmente a codificação para sistemas corporativos


está toda baseada em frameworks.
Frameworks são uma coleção de classes abstratas,
objetos e padrões dedicados a resolver determinados
problemas em uma arquitetura flexível e extensível.
Conhecer esses padrões é fundamental para entender
os modernos frameworks e desenvolver softwares de
qualidade que buscam os melhores resultados da
orientação a objetos.
Frameworks front­end: Bootstrap, foundation, materialize.
Frameworks back­end: laravel (PHP), CodeIgniter (PHP),
Rails (Ruby), .Net Framework (.Net), Django (Python),
Express ([Link]), Ionic (mobile), Struts (Java)
Frameworks para Javascript: Angular e [Link]

1 2 3 4 5 6 7 8 9 10
Padrões Gang of Four História

Em 1995, um grupo de quatro profissionais escreveu e lançou o


livro "Design Patterns”, um catálogo com 23 padrões de desenho.
O grupo passou a ser chamado de Gangue dos Quatro: Erich
Gamma, Richard Helm, Ralph Johnson, e John Vlissides.

1 2 3 4 5 6 7 8 9 10
Padrões Gang of Four
O Padrão GoF é um repertório de soluções e princípios que ajudam os desenvolvedores a criar
software, e que são codificados em um formato estruturado, consistindo de: nome, problema e
solução.
Todo padrão GoF possui então os seguintes atributos:
• Nome – descreve a essência do padrão
• Problema que soluciona – descreve quando aplicar o padrão, e em qual condições
• Solução do problema – descrição abstrata de como usar as classes e objetos para
solucionar o problema
Podemos ainda incluir:
• Exemplos – uma ou mais figuras, diagramas ou descrições que ilustrem um protótipo de
aplicação
• Consequência – custo, benefícios e impacto ao se aplicar o padrão no sistema

1 2 3 4 5 6 7 8 9 10
Padrões Gang of Four
Os padrões GoF estão classificados em:
Padrão de Criação
• Relacionados à criação de classes e
objetos.
• Ligados ao processo de instanciação.
Padrão Estrutural
• Tratam da alteração da estrutura de
um programa, e das associações entre
classes e objetos.
Padrão Comportamental
• Observam a maneira com que classes
e objetos podem interagir.

1 2 3 4 5 6 7 8 9 10
Padrões Gang of Four

1 2 3 4 5 6 7 8 9 10
O conceito de Fábrica (Factory)
Se refere a uma função, método ou classe que deve produzir alguma coisa.
Produzem objetos e também podem produzir arquivos, registros em bases de dados, entre outros.
Um dos padrões de projeto criacionais.
Geralmente, quando alguém diz uma palavra “fábrica”, o significado exato deve ficar claro a partir
de um contexto.
Exemplos:
­ Uma função ou método que cria a interface de um programa;
­ Uma classe que cria usuários;
­ Um método estático que chama uma classe construtora de uma certa maneira;

1 2 3 4 5 6 7 8 9 10
O conceito de Fábrica Simples (Simple Factory)

Esse padrão descreve uma classe que tem um método de criação com uma condicional que,
baseada nos parâmetros do método, escolhe qual classe produto instanciar e retornar.
É comum confundir fábricas simples com fábricas gerais ou com um dos padrões de projeto
criacional.
Comumente uma fábrica simples é uma etapa intermediária na introdução dos padrões Factory
Method ou Fábrica Abstrata.
O Factory Method é um padrão de projeto criacional que fornece uma interface para criação de
objetos, mas permite que subclasses alterem o tipo de um objeto que será criado.
Fábricas simples geralmente não têm subclasses. Mas após extrair subclasses de uma fábrica simples,
ela começa a se parecer como um padrão Factory Method.

1 2 3 4 5 6 7 8 9 10
Fábrica simples Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Fábrica Simples Implementação
Passo 1: implemente as classes Passo 2: implemente a fábrica Passo 3: implemente o executor
A classe abstrata e as classes Aqui fica a lógica que define Esta classe testa a execução
concretas. qual classe será instanciada. da fábrica.

1 2 3 4 5 6 7 8 9 10
Abstract Factory Caso de Uso
O que é? Quando usar? Vantagens
Possibilita a criação de famílias de objetos Um sistema deve ser independente Possibilita a criação de famílias de objetos
relacionados ou dependentes por meio de de como os seus produtos são relacionados ou dependentes por meio de
uma única interface e sem especificar uma uma única interface e sem que a classe
classe concreta. criados, compostos ou
concreta seja especificada.
representados
Utiliza o princípio de Polimorfismo, permitindo O objetivo é isolar a criação de objetos
uma aplicação totalmente adaptável às Um sistema deve ser configurado de seu uso e criar famílias de objetos
mudanças de forma transparente. como um produto de uma família de relacionados sem ter que depender de
Muitas frameworks e bibliotecas Java utilizam múltiplos produtos suas classes concretas, permitindo novos
para fornecer uma maneira de estender e tipos derivados de serem introduzidos sem
personalizar seus componentes padrão. Uma família de objetos for projetada qualquer alteração ao código que usa a
Sempre temos um objeto fábrica, que é para ser usada em conjunto, e você classe base
usada para criar subcomponentes precisa garantir essa restrição Permite utilizar apenas classes abstratas ou
específicos.
Você quer fornecer uma biblioteca interfaces, diminuindo muito o acoplamento
Pode ser aplicado em cenários onde uma entre as classes do sistema, permitindo
família de produtos ou classes precisa ser de classes e quer relevar somente também adicionar, modificar ou remover
instanciado, sem dependência de suas suas interfaces, não suas produtos da família de forma rápida.
classes concretas. implementações

1 2 3 4 5 6 7 8 9 10
Abstract Factory Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Abstract Factory Implementação
Passo 1: implemente as interfaces Passo 2: implemente as classes concretas
Estas interfaces vão definir como serão os tipos de Estas classes vão ser criadas pelas fábricas.
carro.

1 2 3 4 5 6 7 8 9 10
Abstract Factory Implementação
Passo 3: implemente a fábrica abstrata Passo 5: implemente a execução
Agora vamos colocar todas as fábricas para
funcionar.

Passo 4: implemente as fábricas concretas

1 2 3 4 5 6 7 8 9 10
Builder Caso de Uso
O que é? Estrutura Caso de Uso
É um padrão de projeto de ­Director: sua função é construir um Em um fast­food uma pessoa pediu um
objeto utilizando a interface do lanche ao atendente. Este, por sua vez,
software que permite a separação
builder; repassa o pedido para a cozinha, onde
da construção de um objeto o lanche é produzido. Quando pronto,
complexo da sua representação, ­Builder: detalha uma interface para o lanche é entregue ao atendente e,
de forma que o mesmo processo um construtor de partes do objeto­ por fim, a pessoa que pediu. Nesse
produto; pequeno cenário, observa­se:
de construção possa criar
diferentes representações. ­ConcreteBuilder: ajusta uma ­O atendente é apenas um
implementação da interface builder, intermediário entre o cliente e a cozinha
Builder não é usado apenas para mantendo a representação que cria e
construir objetos complexos. Ele ­O atendente não sabe como o lanche
fornece interface para recuperação
permite que diferentes é feito. Apenas repassa o pedido do
do produto;
cliente;
representações possam ser ­Product: é a última etapa, sendo o
construídos com a mesma ­O lanche é feito pelo cozinheiro,
objeto complexo construído. Nele enquanto o atendente apenas o espera
sequência de passos. possui as classes que definem as pronto.
partes que o compõem;

1 2 3 4 5 6 7 8 9 10
Builder Diagrama
Conceitual
Exemplo em termos técnicos
­ O atendente é o Director,
que solicita a construção de
um objeto (produto);
­ O lanche é o Product, ou
seja, o produto resultante da
construção;
­ O quadro de funcionários
que fazem os lanches é o
Builder (Interface);
­ O cozinheiro que preparou
o lanche pedido é o
Concrete Builder (objeto).

1 2 3 4 5 6 7 8 9 10
Builder Implementação
Passo 1: implemente a classe Casa Passo 2: implemente a classe construtora da casa
e a classe Engenheiro
Esta classe é a base para o padrão builder.

1 2 3 4 5 6 7 8 9 10
Builder Implementação
Passo 3: implemente a classe construtora CasaMadeiraBuilder

1 2 3 4 5 6 7 8 9 10
Builder Implementação
Passo 4: implemente a classe construtora CasaConcretoBuilder

1 2 3 4 5 6 7 8 9 10
Builder Implementação
Passo 5: implemente a classe TesteConstrução Casa
Esta classe vai executar a situação depois da
implementação do padrão.

1 2 3 4 5 6 7 8 9 10
Prototype Caso de Uso
O que é? Quando usar? Caso de uso
O Prototype permite a criação de ­ Evitar que as subclasses que criam Temos um objeto e queremos criar uma
novos objetos a partir de um objetos funcionem como o padrão cópia exata dele. Temos que criar um novo
objeto da mesma classe, e, em todos os
modelo original ou protótipo, que abstract factory;
campos do objeto original, copiamos seus
é clonado. ­ Evitar criar um novo objeto valores para o novo objeto.
utilizando a palavra new, o que Mas e se alguns campos do objeto são
diminui o custo de memória. privados e não estão visíveis fora do
próprio objeto?
­ Basicamente, em vez de o cliente
implementar um código que utiliza o O Prototype delega o processo de
clonagem para o próprio objeto que está
operador new, este utiliza o método sendo clonado. O padrão declara uma
clone() presente no protótipo e o interface comum para todos os objetos
método de uma fábrica (Factory que suportam clonagem. Essa interface
Method ou Abstratct Factory) que permite que você clone um objeto sem
fica encarregada de clonar o novo acoplar seu código à classe daquele
objeto. Geralmente, tal interface contém
objeto.
apenas um único método clonar.

1 2 3 4 5 6 7 8 9 10
Prototype Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Prototype Implementação
Passo 1: implemente o protótipo Passo 2: implemente um protótipo para o Fiesta
A classe abstrata CarroPrototype vai definir
como serão os carros reais.

1 2 3 4 5 6 7 8 9 10
Prototype Implementação
Passo 3: implemente a execução do protótipo

1 2 3 4 5 6 7 8 9 10
Singleton Caso de Uso
O que é? Quando usar?
O Singleton é um padrão de Garantir que uma classe tenha apenas uma única instância. A razão
projeto criacional, que garante mais comum para isso é para controlar o acesso a algum recurso
que apenas um objeto desse tipo compartilhado—por exemplo, uma base de dados ou um arquivo.
exista e forneça um único ponto
Fornece um ponto de acesso global para aquela instância. Embora
de acesso a ele para qualquer
sejam muito úteis, elas também são muito inseguras uma vez que
outro código.
qualquer código pode potencialmente sobrescrever os conteúdos
daquelas variáveis e quebrar a aplicaçã[Link] como uma variável
global, o padrão Singleton permite que você acesse algum objeto de
qualquer lugar no programa. Contudo, ele também protege aquela
instância de ser sobrescrita por outro código.

1 2 3 4 5 6 7 8 9 10
Singleton Implementação
Passo 1: implemente a classe Reitor Passo 2: implemente um protótipo para o Fiesta
Só pode ter um reitor, portanto tornaremos o
Reitor estático, seguindo o padrão.

1 2 3 4 5 6 7 8 9 10
Object Adapter Caso de Uso
É um padrão de projeto estrutural, que permite a colaboração de objetos incompatíveis. Ele captura chamadas
para um objeto e as deixa reconhecíveis tanto em formato como interface para um segundo objeto.

O Padrão Adapter converte uma interface de uma classe para outra interface que o cliente espera encontrar
(permite que classes com interfaces incompatíveis trabalhem juntas). É um intermediador que recebe solicitações do
cliente e converte essas solicitações num formato que o fornecedor entenda.

É muito utilizado quando precisamos encaixar uma nova biblioteca de classes, adquirida de um fornecedor já
existente, porém as bibliotecas do novo fornecedor são diferentes das bibliotecas do fornecedor antigo.

Como não temos o código do novo fornecedor e também não podemos alterá­la, o que pode ser feito é criar uma
classe que faça essa adaptação, ou seja, ela é responsável por adaptar a interface do novo fornecedor ao
formato que o sistema espera.

É muito utilizado para compatibilizar o seu sistema a outros frameworks ou APIs.

1 2 3 4 5 6 7 8 9 10
Object Adapter Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Object Adapter Implementação
Passo 1: implemente as tomadas Passo 2: implemente o adaptador
Temos a tomada dois pinos e a tomada tres pinos. Esta classe vai fazer a ligação entre a tomada de
dois pinos e a tomada de tres pinos.

1 2 3 4 5 6 7 8 9 10
Object Adapter Implementação
Passo 3: executanddo o padrão
Ligando uma tomada de 3 pinos em uma tomada
de 2 pinos.

1 2 3 4 5 6 7 8 9 10
Bridge Caso de Uso
Bridge é utilizado quando queremos separar a abstração da implementação, é considerado um padrão estrutural.

­ Evita uma ligação permanente entre uma abstração e implementação;


­ Protege o cliente das alterações de implementações;
­ Esconde completamente uma implementação do cliente;
­ Possui menor complexidade para organizar hierarquias ;

Bridge facilita quando temos uma quantidade grande de hierarquias e extensões, logo simplifica o uso das
implementações, isolando elas do cliente, assim como uma melhor separação entre abstração e implementação.

1 2 3 4 5 6 7 8 9 10
Bridge Diagrama
Conceitual

­Abstraction: Esta é uma classe abstrata que


contém os membros que definem a abstração de
negócios e suas funcionalidades. Contém uma
referência para o objeto do tipo Bridge. Também é
responsável por ser a classe base para outras
abstrações.
­Redefined Abstraction: classe que herda da classe
Abstraction, estendendo a interface definida por ela.
­Bridge: Esta é uma interface que age como uma
ponte entre a classe de abstração e de
implementação, e também tem a funcionalidade de
tornar a classe de implementação independente da
classe de abstração.
­Implementation: classes tem como objetivo
implementar a interface Bridge e também
responsáveis por exibir os detalhes de
implementação para a abstração associada a
ponte.

1 2 3 4 5 6 7 8 9 10
Bridge Implementação
Passo 1: implemente a classe abstrata Passo 2: implemente as classes concretas

1 2 3 4 5 6 7 8 9 10
Bridge Implementação

Passo 3: implemente a interface do serviço Passo 4: implemente as classes concretas do serviço

Passo 5: implemente o executor

1 2 3 4 5 6 7 8 9 10
Composite Caso de Uso

Esse padrão de projetos pode ser visto como uma estrutura de árvore
composta de tipos que herdam um tipo base e pode representar uma
única parte ou toda uma hierarquia de objetos.
Este padrão pode ser dividido em:
Componente – é a interface base para todos os objetos na
composição. Deve ser uma interface ou uma classe abstrata com os
métodos comuns para gerenciar os compostos filhos.
Folha – implementa o comportamento padrão do componente base. Ele
não contém uma referência aos outros objetos.
Composto – tem elementos folha. Ele implementa os métodos do
componente base e define as operações relacionadas ao filho.
Cliente – tem acesso aos elementos de composição usando o objeto
componente base.

1 2 3 4 5 6 7 8 9 10
Composite Diagrama
Conceitual

printNomeDepart

1 2 3 4 5 6 7 8 9 10
Composite Implementação

Passo 1: implemente a interface Departamento Passo 2: implemente a classe DepartamentoVendas


Esta interface contem todas os métodos, ainda sem Esta classe contrata a interface Departamento, o que
a implementação do padrão. obriga a classe DepartamentoVendas a implementar
as ações.

1 2 3 4 5 6 7 8 9 10
Composite Implementação

Passo 3: implemente a classe Passo 4: implemente a classe DepartamentoChefe


DepartamentoFinanceiro
Esta classe contrata a interface Departamento, e terá
Esta classe contrata a interface Departamento, o que
como atributo uma lista de departamentos
obriga a classe DepartamentoFinanceiro a
implementar as ações.

1 2 3 4 5 6 7 8 9 10
Composite Implementação

Passo 5: implemente a classe executora


Esta classe instancia os departamentos.

1 2 3 4 5 6 7 8 9 10
Decorator Caso de Uso

Pesquisa a ser realizada pelos alunos.

1 2 3 4 5 6 7 8 9 10
Decorator Diagrama
Conceitual

Pesquisa a ser realizada pelos alunos.

1 2 3 4 5 6 7 8 9 10
Decorator Implementação

Pesquisa a ser realizada pelos alunos.

1 2 3 4 5 6 7 8 9 10
Facade Caso de Uso

O Padrão Facade (tradução: fachada) fornece uma interface unificada para um conjunto de interfaces em um subsistema
(define uma interface de nível mais alto que facilita a utilização de um subsistema)
Este nome é uma analogia para uma fachada de arquitetura. Um Facade é um objeto que provê uma interface simplificada
para um corpo de código maior, como por exemplo, uma biblioteca de classes.
É do tipo estrutural, usado quando um sistema é muito complexo ou difícil de entender, já que possui um grande número de
classes independentes, ou se trechos de código­fonte estão indisponíveis.
Quando utilizar:
­ Quando se deseja uma interface simplificada para um subsistema muito complexo. Subsistemas comumente ficam mais
complexos a medida que evoluem e a maioria dos padrões, quando aplicados, resultam em muitas classes de pequeno
tamanho. Isso torna o subsistema mais reutilizável e simples de se customizar.
­ Quando existem muitas dependências entre clientes e classes de implementação.
­ Quando há o interesse em dividir os subsistemas em camadas. O facade pode definir um ponto de entrada para cada nível
de subsistema. Se seus subsistemas são dependentes, essas dependências podem ser simplificadas entre si ao se comunicarem
exclusivamente pelo facade.
­ Em uma situação que exista um sistema com diversas classes contendo diversos métodos e tenhamos que agrupar todas
essas classes chamando diversos métodos para realizar uma determinada operação. Com o Facade precisaríamos apenas
construir um método que agrupe todas essas classes e chame todos esses métodos.

1 2 3 4 5 6 7 8 9 10
Facade Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Facade Implementação

Passo 1: implemente a classe CPU Passo 2: implemente as classes HardDrive e Memoria


Esta classe irá compor uma classe maior. Estas classes irã compor uma classe maior.

1 2 3 4 5 6 7 8 9 10
Facade Implementação

Passo 3: implemente a classe Computador Passo 4: implemente a classe Executora


Esta classe será uma fachada para todas as O código comentado é a execução sem o padrão
classes anteriores, simplificando a execução Facade.

1 2 3 4 5 6 7 8 9 10
Flyweight Caso de Uso

Flyweight é utilizado quando dentro do código possui uma grande quantidade de objetos que
devem ser tratados em memória, onde muitos deles possuem informações repetidas.
Para diminuir o alto consumo de memória pode ser criado um objeto que será compartilhado
inúmeras vezes.
Esse padrão de projetos é usado em casos muito específicos, por conta disso sua popularidade é
muito baixa. Entretanto não pode ser considerado como um padrão desprezado, pois ele é muito
utilizado principalmente em reutilizar objetos em processadores de texto e também é usado nos
exploradores de arquivo, que podem compartilhar objetos do mesmo tipo de arquivo para reduzir o
tempo de carga e exibição.
No exemplo a seguir será mostrado um programa na qual gerará círculos de diferentes cores e
posições.

1 2 3 4 5 6 7 8 9 10
Flyweight Diagrama
Conceitual

­FlyweightPatternDemo: exemplifica o cliente


que está utilizando a Factory, solicitando os
círculos e suas cores;
­ShapeFactory: possui um HashMap interno de
círculos, tendo como chave de identificação a
cor do círculo. Sempre que um novo círculo for
requisitado com uma cor específica, ele irá
verificar se já não construiu algum daquela
cor. Se sim, irá fornecer uma referência para a
o círculo já existente, caso contrário, irá criar
um novo, armazenar no HashMap e fornecer a
referência dele;
­Shape e Circle: Interface para definir uma
forma gráfica e implementação da mesma
como círculo, que são utilizadas pelo
ShapeFactory e fornecidas ao cliente
FlyweightPatternDemo;

1 2 3 4 5 6 7 8 9 10
Flyweight Implementação

Passo 1: implemente a classe abstrata forma Passo 2: implemente as classes circulo e quadrado
Esta classe abstrata será utilizada para gerar Estas classes são filhas da classe forma
outras formas concretas.

1 2 3 4 5 6 7 8 9 10
Flyweight Implementação

Passo 3: implemente a classe FormaFactory Passo 4: implemente a classe FormaClient


Esta classe utiliza o fabrica de formas para criar
uma forma e desenha­la

1 2 3 4 5 6 7 8 9 10
Flyweight Implementação

Passo 5: implemente a classe executora

1 2 3 4 5 6 7 8 9 10
Proxy Caso de Uso e
Diagrama Conceitual

O Proxy é um padrão de projeto estrutural que permite


que você forneça um substituto para outro objeto.
Um proxy controla o acesso ao objeto original,
permitindo que você faça algo antes ou depois do
pedido chegar ao objeto original.
Podemos criar este padrão quando:
­ temos um objeto caro para ser criado e não
queremos permitir acesso direto a esse objeto.
­ restringimos o acesso a partes da sua aplicação.
­ podemos ter uma ligação entre o sistema e um sistema
remoto.
­ queremos fazer cache de chamadas já realizadas.
­ queremos interceptar quaisquer chamadas de
métodos no objeto real (por exemplo, criar logs).

1 2 3 4 5 6 7 8 9 10
Proxy Implementação

Passo 1: implemente a interface ObjetoCaro Passo 2: implemente a classe ImplementacaoObjetoCaro


Esta interface contem todos os métodos, ainda sem Esta classe contrata a interface ObjetoCaro, o que
a implementação do padrão. obriga a classe Implementacao ObjetoCaro a
implementar as ações.

1 2 3 4 5 6 7 8 9 10
Proxy Implementação

Passo 3: implemente a classe ProxyObjetoCaro Passo 4: implemente a classe Proxy


Esta classe contrata a interface ObjetoCaro, o que Esta classe Proxy executa a classe Proxy, em vez de
obriga a classe ProxyObjetoCaro a implementar as acessar o ObjetoCaro
ações.

1 2 3 4 5 6 7 8 9 10
Chain of responsability Caso de Uso

Chain of Responsability é um padrão de projeto comportamental que utiliza a ideia de baixo acoplamento
por permitir que outros objetos da cadeia tenham a oportunidade de tratar uma solicitação. Consiste em uma
série de objetos receptores e de objetos de solicitação.
Cada objeto de solicitação possui uma lógica interna que separa quais são tipos de objetos receptores que
podem ser manipulados. O restante é passado para o próximo objetos de solicitação da cadeia.
A intenção é evitar o acoplamento do remetente de uma solicitação ao seu receptor, ao dar a oportunidade
de tratar essa solicitação a mais de um objeto. Encadear os objetos receptores, passando a solicitação ao
longo da cadeia até que um objeto a trate. A principal função é evitar a dependência entre um objeto
receptor e um objeto solicitante.

As vantagens deste padrão são:


­ Permite determinar quem será o objeto que irá tratar a requisição durante a execução, e qual a ordem de
tratamento.
­ Cada objeto pode tratar ou passar a mensagem para o próximo na cadeia. Dessa forma, o acoplamento é
reduzido, dando ainda flexibilidade adicional na atribuição de responsabilidades.
­ É possível introduzir novos objetos no sistema sem quebrar o código existente

1 2 3 4 5 6 7 8 9 10
Chain of responsability Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Chain of responsability Implementação

Passo 1: implemente a interface CaixaEletronico Passo 2: implemente as classes CaixaNota10,


CaixaNota20, CaixaNota50 e CaixaNota100
Esta interface contem todos os métodos, ainda sem
a implementação do padrão. Estas classes irão formar a rede de responsabilidade.

1 2 3 4 5 6 7 8 9 10
Chain of responsability Implementação

1 2 3 4 5 6 7 8 9 10
Chain of responsability Implementação

Passo 3: implemente a classe SaqueDinheiro


Esta classe dispara a rede de responsabilidade

Passo 4: implemente a classe chain e a


executora
A classe CHain implementa a rede de
responsabilidade e a classe main executa todo
o código.
1 2 3 4 5 6 7 8 9 10
Command Caso de Uso

O principal objetivo deste padrão é encapsular uma solicitação como um objeto, fazendo com que
permita criar parâmetros em outros objetos com diferentes solicitações, além disso é possível: enfileirar
ou registrar solicitações e implementar recursos de cancelamento de operações. Isso inclui informações
como método que pertence ao objeto e até os valores de parâmetros.
As vezes temos uma série de eventos sendo recebidos ou é preciso atualizar uma interface de usuário
operando diferentes classes para uma ação. Usando esse método, podemos separar essa lógica em
classes de responsabilidade única por ação, podendo ter um histórico de execução ou permitindo
desfazer uma ação caso algo esteja errado.
O ponto principal do Command é o uso de uma classe abstrata ou interface que inclui uma operação
abstrata “Execute”. As subclasses concretas do Command especificam um par receptor­ação através
do armazenamento do receptor como uma variável de instância e pela implementação de Execute
para invocar a solicitação. Desta forma, todos os clientes de objetos command tratam cada objeto
como uma “caixa preta”, simplesmente invocando o método execute(). O Command faz com que seja
mais fácil construir componentes que transmitem, enfileiram ou executam métodos em um momento de sua
escolha, sem a necessidade de conhecer a classe do método ou os parâmetros do método.

1 2 3 4 5 6 7 8 9 10
Command Diagrama
Conceitual

executar
botaoLigarPress
botaoDesligarPress mover
parar

1 2 3 4 5 6 7 8 9 10
Command Implementação

Passo 1: implemente as classes pião e carro Passo 2: implemente a interface ComandoBase


Estas duas classes reproduzem objetos que são Esta interface vai ser contrada por todos os
controlados por um controle remoto. comandos executados pelo controle remoto.

1 2 3 4 5 6 7 8 9 10
Command Implementação

Passo 3: implemente a classe PiaoRodarComando Passo 4: implemente a classe CarroMoverComando


Esta classe implementa o comando de rodar o pião, Esta classe implementa o comando de mover o
contratando a interface ComandoBase. carro, contratando a interface ComandoBase.

1 2 3 4 5 6 7 8 9 10
Command Implementação

Passo 5: implemente a classe PiaoPararComando Passo 6: implemente a classe CarroPararComando


Esta classe implementa o comando de parar o pião, Esta classe implementa o comando de parar o
contratando a interface ComandoBase. carro, contratando a interface ComandoBase.

1 2 3 4 5 6 7 8 9 10
Command Implementação

Passo 7: implemente a classe Controle Remoto Passo 8: implemente a classe executora


Estas duas classes reproduzem objetos que são
controlados por um controle remoto.

1 2 3 4 5 6 7 8 9 10
Iterator Caso de Uso

É um padrão que provem uma forma de sequencialmente acessar os elementos de uma coleção sem
expor sua representação interna.
Pode ser usado quando:
­ Quando necessário remover a complexidade de dentro da coleção principal. Isso permite que a
coleção foque apenas em armazenar dados de maneira eficiente.
­ Sua coleção pode ter vários modos de travessia.
­ Quando quer disponibilizar protocolos de travessia para diferentes tipos de coleções.
­ Para acessar o conteúdo de uma coleção sem expor suas representação interna.
As principais vantagens de utilizar o padrão Iterator são: você pode atrasar uma iteração e continuá
la quando necessário; é possível atravessar várias vezes a mesma coleção em paralelo usando outro
objeto iterator; não polui o código do objeto principal com vários métodos e algoritmos de travessia
diferentes; é fácil adicionar novos objetos iteradores com algoritmos de travessia completamente
diferentes.

1 2 3 4 5 6 7 8 9 10
Iterator Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
Iterator Implementação

Passo 1: implemente uma lista sem usar Iterator Passo 2: implemente uma lista usando Iterator

1 2 3 4 5 6 7 8 9 10
Mediator Caso de Uso

É um padrão de projeto comportamental usado frequentemente quando se deseja encapsular a forma


como os objetos interagem entre si. Promove o fraco acoplamento entre os componentes fazendo­os se
comunicar indiretamente, por meio de um objeto mediador especial.
Evita que objetos se refiram uns aos outros explicitamente. Facilita a modificação, extensão e
reutilização de componentes porque eles não serão mais dependentes de diversas outras classes.
Pode ser usado quando:
­ Quando você precisa de um conjunto de objetos se comunicam de maneira bem definida, porém
complexas, o que dificulta o entendimento.
­ Quando um objeto é difícil de ser reutilizado pois se referencia/comunica com muitos outros objetos.
­ Quando um comportamento está distribuído entre diversas classes que deveria ser customizável,
evitando a especialização em subclasses.

1 2 3 4 5 6 7 8 9 10
Mediator Diagrama
Conceitual

Torre de comando do aeroporto


Considere dois pilotos de avião,
um está aterrissando e outro está
decolando, eles se comunicam de
forma direta? A resposta é não.
As mensagens são todas
controladas pela torre de controle,
que possuí a responsabilidade de
gerenciar quem decola e quem
aterrissa. As restrições de decolagem
e aterrissagem ficam por conta da torre de controle.
Observe que neste exemplo têm­se os participantes do padrão. O MediatorConcreto é a torre de controle e
como ColegaConcreto os pilotos de avião.
É importante ressaltar que a torre de controle não controla o voo por completo.

1 2 3 4 5 6 7 8 9 10
Mediator Implementação

Pesquisa a ser realizada pelos alunos.

1 2 3 4 5 6 7 8 9 10
Memento Caso de Uso

É um padrão de projeto comportamental que permite que o usuário salve e restaure o estado anterior
de um objeto sem revelar os detalhes e os dados de sua implementação.
Pode ser usado em aplicações que precisem recuperar os dados anteriores de um objeto específico,
por exemplo na personalização de relatórios, possibilitando que o usuário desfaça as alterações.
Ao implementar o “desfazer” existe a possibilidade de usar em conjunto o Command e o Memento, por
exemplo o objeto será salvo momentos antes do usuário executar um comando.

1 2 3 4 5 6 7 8 9 10
Memento Diagrama
Conceitual

Editor de Texto
Será utilizado como exemplo um editor de texto
que permite com que o usuário crie modificações
que podem ser desfeitas ou repetidas.
O “desfazer” é baseado na colaboração entre
os padrões Memento e Command. O editor rastreia
um histórico dos comandos executados. Antes de
executar qualquer comando, ele faz um backup e
o conecta ao objeto de comando. Após a execução,
ele adiciona o comando executado para o histórico.
Quando um usuário solicita o desfazer, o editor busca um comando recente do histórico e restaura o estado do
backup mantido dentro desse comando. Se o usuário solicitar outro desfazer, o editor utilizará o próximo
comando do histórico e assim por diante.
Os comandos revertidos são mantidos no histórico até que o usuário faça algumas modificações nas formas na
tela. Isso é crucial para refazer comandos desfeitos.

1 2 3 4 5 6 7 8 9 10
Memento Implementação

Pesquisa a ser realizada pelos alunos.

1 2 3 4 5 6 7 8 9 10
Observer Caso de Uso

O Observer é um padrão de projeto comportamental que permite que você defina um mecanismo de
assinatura para notificar múltiplos objetos sobre quaisquer eventos que aconteçam com o objeto que
eles estão observando.
Facilita a comunicação entre objetos em tempo de execução e podemos introduzir novas classes
assinantes sem ter que mudar o código da publicadora.
Pode ser usado quando:
­ Quando uma modificação do estado de um objeto implica modificações em outros objetos;
­ Utilize o padrão quando alguns objetos em sua aplicação devem observar outros, mas apenas por
um tempo limitado ou em casos específicos.
­ Quando uma mudança a um objeto requer mudanças a outros e você não sabe quantos outros
objetos devem mudar.
­ Quando um objeto deve ser capaz de avisar outros sem fazer suposições sobre quem são os objetos.

1 2 3 4 5 6 7 8 9 10
Observer Diagrama
Conceitual

update mover
parar

1 2 3 4 5 6 7 8 9 10
Observer Implementação

Passo 1: implemente a Passo 2: implemente as classes concretas binaryObserver, hexaObserver e octalObserver


classe abstrata
observer

1 2 3 4 5 6 7 8 9 10
Observer Implementação

Passo 3: implemente a classe subject Passo 4: implemente o executor

1 2 3 4 5 6 7 8 9 10
State Caso de Uso

É um padrão de projeto comportamental que permite que um objeto altere seu comportamento quando
seu estado interno muda. O padrão encapsula os estados em classes separadas e delega as tarefas
para o objeto que representa o estado atual. Os comportamentos mudam com o estado interno.
Ele extrai comportamentos relacionados ao estado em classes separadas de estado, e força o objeto
original a delegar o trabalho para uma instância dessas classes, em vez de agir por conta própria.
Pode ser usado quando:
­ Quando temos um objeto que se comporta de maneira diferente dependendo do seu estado atual,
quando o número de estados é enorme, e quando o código estado específico muda com frequência.
­ Para simplificar os casos em que há código complicado e extenso de decisão que depende do
estado do objeto.
­ Quando você tem muito código duplicado em muitos estados parecidos e transições de uma
máquina de estado baseada em condições.

1 2 3 4 5 6 7 8 9 10
State Diagrama
Conceitual

1 2 3 4 5 6 7 8 9 10
State Implementação

Passo 1: implemente a classe abstrata EstadoLivro Passo 2: implemente a classe Disponível

1 2 3 4 5 6 7 8 9 10
State Implementação

Passo 3: implemente a classe Emprestado

1 2 3 4 5 6 7 8 9 10
State Implementação

Passo 4: implemente a classe Livro

1 2 3 4 5 6 7 8 9 10
State Implementação

Passo 5: implemente a classe executora

1 2 3 4 5 6 7 8 9 10
Strategy Caso de Uso

Esse padrão de projeto transforma um conjunto de comportamentos em objetos e os torna


intercambiáveis (conseguem interagir entre eles) dentro do objeto de contexto original.
O padrão Strategy é muito comum no código Java. É muito usado em várias estruturas para fornecer
aos usuários uma maneira de alterar o comportamento de uma classe sem estendê­la. Algumas
bibliotecas possuem o padrão strategy, sendo elas:
­ [Link]: função que compara e impõe uma ordenação total em algumas coleções de
objetos;
­ [Link]: é usado para interceptar a requisição do cliente ou fazer pré­processamento;

1 2 3 4 5 6 7 8 9 10
Strategy Diagrama
Conceitual

O strategy é usado para implementar os vários métodos de pagamento em uma


loja. Depois de selecionar um produto para comprar, o cliente escolhe uma forma
de pagamento: débito ou crédito.
Esse padrão de projeto não apenas executa o pagamento real, mas também
alteram o comportamento do formulário de pagamento, fornecendo campos
apropriados para registrar os detalhes do pagamento (dependendo da forma
de pagamento que o usuário escolher).
­Context: mantém uma referência para uma das estratégias concretas e se
comunica com esse objeto através da interface da estratégia.
­Strategy(interface): é uma interface comum à todas as estratégias concretas. Ela
declara um método que o contexto usa para executar uma estratégia.
­ConcreteStrategies: implementam diferentes variações de um algoritmo que o
contexto usa.
O contexto chama o método de execução no objeto strategy ligado cada vez
que ele precisa rodar um algoritmo. O contexto não sabe qual tipo de
estratégia ele está trabalhando ou como o algoritmo é executado.
O Client cria um objeto estratégia específico e passa ele para o contexto. O
contexto expõe um setter que permite o cliente mudar a estratégia associada
com contexto durante a execução

1 2 3 4 5 6 7 8 9 10
Strategy Implementação

Pesquisa a ser realizada pelos alunos.

1 2 3 4 5 6 7 8 9 10
Visitor Caso de Uso

É um padrão de projeto comportamental que permite Representar uma operação a ser executada nos
elementos de uma estrutura de objetos. Visitor permite definir uma nova operação sem mudar as classes
dos elementos sobre os quais opera.
Pode ser usado quando:
­ Precisamos fazer uma operação em todos os elementos de uma estrutura de objetos complexa (por
exemplo, uma árvore de objetos).
­ Muitas operações distintas e não relacionadas devem ser realizadas numa estrutura de objetos e
você quer evitar "poluir" as classes com estas operações
­ As classes que definem a estrutura de objetos raramente muda mas a adição de novas operações é
frequente.

1 2 3 4 5 6 7 8 9 10
Visitor Diagrama
Conceitual

inserir(visitor) visitar(livro)
visitar(fruit)

1 2 3 4 5 6 7 8 9 10
Visitor Implementação

Passo 1: implemente as interfaces Passo 2: implemente a classe concreta


CarrinhoDeComprasVisitor e Item CarrinhoDeComprasVisitorImpl

1 2 3 4 5 6 7 8 9 10
Visitor Implementação

Passo 3: implemente a classe Fruit Passo 4: implemente a classe Livro

1 2 3 4 5 6 7 8 9 10
Visitor Implementação

Passo 5: implemente a classe executora

1 2 3 4 5 6 7 8 9 10
Referências
Livro – Padrões de Projeto ­ Erich Gamma, Richard Helm, Ralph Johnson, e John Vlissides
Artigo – Framework: o que é, quais utilizar e como eles funcionam – Site Hostgator
Pesquisa Abstract Factory, Object Adapter, Facade, Chain of Responsability, Memento, State ­ Daniel Borba
Guimães da Costa / Thais Resende Araújo Borges Bonfim
Pesquisa Builder, Bridge, Flyweight, Command, Strategy ­ David Gabriel B. Jorge / Murillo Sampaio Oliveira Antonio
Pesquisa Prototype, Composite, Proxy, Iterator, Obsever, Visitor ­ Otavio Augusto Ribeiro Araujo
Pesquisa Singleton. Proxy, Iterator, Obsever, Visitor ­ Victor Barcelos Pires de Sousa

1 2 3 4 5 6 7 8 9 10
Só mais uma coisa...

O professor não é dono do saber.


O professor é um organizador de conhecimento, que tem a experiência adequada
para selecionar o que é relevante neste mar infinito de informação.
marco@[Link] Telegram

Produzido em 2024

Você também pode gostar