Escolar Documentos
Profissional Documentos
Cultura Documentos
O G U I A
R A D O D O S
ILUS T
P A T T E R N S
DESIG N
APRENDA DE FORMA FÁCIL E VISUAL
Rabiscando
PADRÕES DE
PROJETO
"The only way to go fast is to go well"
"A única forma de ir rápido é ir certo"
Robert Cecil Martin POO
(Uncle Bob)
designpatterns.com.br 2
Prezado leitor,
Muito obrigado por ter baixado este e-book e me dar a honra de te ajudar a
aprender Design Patterns.
Durante a minha jornada até aqui, um dia, assim como você, eu decidi estudar
Design Patterns e me deparei com um assunto muito vasto, complexo e com
pouquíssimo material de qualidade sobre o assunto. POO
Tudo o que eu encontrava era complexo demais ou não se aprofundava nos
detalhes de forma satisfatória.
Decidi explicar Design Patterns de uma forma fácil e completa para quem
Vinicius Vivan estivesse interessado no assunto. Criei o material que um dia eu desejei
Cientista da computação encontrar e agora ele está aqui de graça pra você.
e autor deste ebook
Bons Estudos!
designpatterns.com.br 3
Dê um Zoom
e
Leia Devido a limitação de espaço, alguns textos
desse e-book podem ter ficados pequenos.
POO
designpatterns.com.br 5
ATENÇÃO
Antes de avançar nesse e-book é preciso
que você saiba de algumas coisas.
POO
Para garantir que a maioria dos leitores tenham o
conhecimento básico necessário, foi disponibilizado o
módulo 00 que é um NIVELADOR de conhecimentos.
designpatterns.com.br 4
MÓDULO 00
Nivelamento
POO
designpatterns.com.br 6
Nivelamento
REVISÃO DE CONCEITOS FUNDAMENTAIS DE
PROGRAMAÇÃO ORIENTADA A OBJETOS
APERT
E Você vai revisar:
Y
O PLA
As definições de classe, classe abstrata, métodos,
POO
métodos abstratos, objetos e interfaces.
designpatterns.com.br 7
Nivelamento
O QUE SÃO PADRÕES DE PROJETO
(DESIGN PATTERNS)
APERT
E Você vai aprender:
Y
O PLA
O que são padrões de projeto.
POO
O que e quais são os padrões criacionais.
designpatterns.com.br 8
MÓDULO 01
PADRÃO CRIACIONAL
Singleton
POO
"Um objeto
e nada mais"
designpatterns.com.br 9
Singleton
A DEFINIÇÃO
O padrão Singleton garante que uma classe tenha apenas uma
instância e fornece um ponto global de acesso a ela.
O EXEMPLO
POO
Para evitar conexões desnecessárias, deseja-se criar uma única
Única instância da instância de um objeto de conexão com o banco de dados.
conexao classe Conexao
Objeto 2 Objeto 4
Objeto 3
designpatterns.com.br 10
Singleton
ATENÇÃO: O singleton é
Conexao considerado um anti-pattern.
Sua utilização requer muita
instancia: Conexao | null cautela.
designpatterns.com.br 11
Singleton DIAGRAMA DE CLASSES
ILUSTRADO
1
ClienteA Conexao
Talvez você esteja se perguntando o motivo do Singleton con: Conexao
estar nesse e-book, já que ele é considerado um anti- instancia: Conexao | null 2
pattern. Os motivos são muito simples:
5 construtor() 3
1) Existe um conceito muito interessante por trás do
Singleton. Somente isso já justificaria a presença dele por this.con = Conexao.getInstancia(); getInstancia(): Conexao 4
aqui.
designpatterns.com.br 12
MÓDULO 02
PADRÃO COMPORTAMENTAL
Stratregy
POO
POO
O EXEMPLO
Deseja-se criar uma calculadora de inteiros que possa ter as
operações facilmente expandidas.
Cada operação é um algoritmo que faz a mesma coisa, realiza um calculo
entre dois inteiros, porém, cada operação faz isso de formas diferentes
+ - * / ?
designpatterns.com.br 14
Strategy
Qualquer uma dessas operações podem ser
Tenho 2 números para calcular. utilizadas da mesma forma pela calculadora. Elas Podem existir quantas operações
podem ser facilmente substituídas umas pelas forem necessárias. Todas dever ter
preciso de alguma operação. outras. Isso é a mesma coisa que dizer que elas são o método calcular
intercambiáveis.
Pode ser qualquer uma. Sei que todos os
+ - / ?
membros da família de operações sabem
*
calcular números.
POO
Família de Operações
(Família de algoritmos)
É obrigatório que todo membro dessa família tenha o método
calcular(operandoA, operandoB)
designpatterns.com.br 15
Strategy DIAGRAMA DE CLASSES
ILUSTRADO
1
Calculadora <<interface>> 3
Operacao Família de Operações
operandoA: int (Família de algoritmos)
calcular(operandoA, operandoB)
operandoB: int
operacao: Operacao
4 4 4 4
Soma Subtracao Multiplicacao Divisao
setOperacao(Operacao operacao)
calcular(operandoA, operandoB)
/
2 return operandoA + OperandoB; return operandoA - OperandoB * return operandoA / OperandoB
designpatterns.com.br 16
MÓDULO 03
PADRÃO CRIACIONAL
O EXEMPLO POO
Criar um objeto manequim com uma peça de roupa.
designpatterns.com.br 18
Factory Method
A classe Manequim precisa
de um objeto do tipo Roupa.
<<inteface>>
Cliente Manequim Roupa
Dependência
roupa: Roupa
Qual é o problema aqui? Imagine que ao invés de uma classe, existam 5 classes que precisem de um objeto
Roupa. Esse switch case iria se repetir em todas as classes. As regras para criar um objeto Roupa estariam
espalhadas por todo o sistema.
designpatterns.com.br 19
Factory Method
VAMOS DEIXAR AS COISAS MAIS INTERESSANTES
Considere que agora existam dois estilos de roupa: Formal e Causal. Podemos criar dois métodos na classe Manequim, um que cria roupas formais e outro que
cria roupas casuais.
<<inteface>>
Cliente
Manequim Roupa
Dependência
roupa: Roupa
roupa = manequim.criarRoupaCasual('tronco');
/*supondo que Manequim possui um método setter*/
manequim.setRoupa(roupa);
Utilizando o método
criarRoupaCasual
designpatterns.com.br 20
Factory Method
Retomando a definição: O Padrão Factory Method define uma interface para
criar um objeto, mas permite que as subclasses possam decidir qual classe
instanciar, possibilitando que uma classe seja capaz de prorrogar a instanciação Os dois métodos da classe Manequim foram
de uma classe para subclasses. substituídos por um método abstrato. Repare
que o método CriarRoupa recebe o mesmo
parâmetro e possui o mesmo tipo de retorno
que os métodos anteriores.
por ter um método abstrato, Manequim se
criarRoupa é um
torna uma classe abstrata. <<inteface>>
método abstrado, Roupa
então, as subclases de Dependência
Manequim deverão Manequim
implementar esse
método. roupa: Roupa
Esse método é a interface
Camisa Camiseta
para criar um objeto citada
Factory Method criarRoupa(string parteDoCorpo): Roupa na definição.
Herança Herança
Calcas Bermuda
ManequimFormal ManequimCasual
designpatterns.com.br 21
Factory Method
<<inteface>>
Roupa
Manequim
Dependência
Cliente roupa: Roupa
Herança Herança
ManequimFormal ManequimCasual
Calcas Bermuda
criarRoupa(string parteDoCorpo): Roupa criarRoupa(string parteDoCorpo): Roupa
Sapatos Tenis
manequim = new ManequimFormal(); manequim = new ManequimCasual();
designpatterns.com.br 22
Factory Method DIAGRAMA DE CLASSES
ILUSTRADO
1 3 4
Cliente
A classe Manequim é uma classe Abstrata. ela É o tipo abstrato do objeto retornado pelo São as classes concretas que implementam
possui um método abstrato que define a Factory Method. Podemos dizer que Roupa é Roupa. Ou seja, são as classes cujo os
interface para a criação de um objeto. Tal o PRODUTO produzido pelo Factory Method. objetos serão de fato instanciados e
método é o Factory Method e será retornados pelo Factory Method.
implementado pelas subclasses de Manequim.
1 <<inteface>> 3
Manequim Roupa
Dependência Abstrata
roupa: Roupa
Herança Herança
2 2
ManequimFormal ManequimCasual
Dependência Concreta
2 4 4
Sapatos Tenis
As subclasses de Manequim ditam como e qual objeto
será criado pela implementação concreta do Factory
Method (criarRoupa).
designpatterns.com.br 23
MÓDULO 04
PADRÃO CRIACIONAL
O EXEMPLO POO
Criar um meio para que um objeto manequim possa ser vestido
com peças de roupas para o tronco e pernas e sapatos.
designpatterns.com.br 25
Abstract Factory
Enquanto o padrão Factory Method fornece uma interface para a criação de objetos, o padrão Abstract
Factory fornece uma interface para criar uma família de objetos.
Em outras palavras, o Abstract Factory fornece uma interface para a criação de objetos que
fazem sentido juntos. Além disso, membros de uma família de objetos não devem se misturar
com membros de outras famílias.
<<inteface>>
Considere as mesmas classes de roupas Roupa
Aqui temos duas famílias de objetos: Camisa Camiseta ATENÇÃO: Para entender o
Traje Formal Abstract Factory recomendo
Traje Casuais que já tenha entendido o
padrão Factory Method.
Calcas Bermuda
designpatterns.com.br 26
Abstract Factory
Factory Method Abstract Factory
Manequim A classe Manequim espera apenas objetos do tipo Roupa. A classe Manequim espera 3 tipos diferentes de objetos, uma
Não existe distinção do tipo de roupa que cada parte do Manequim para cada parte do corpo.
manequim recebe.
tronco: Roupa tronco: RoupaTronco As Factories deve criar 3 objetos, um de cada tipo.
pernas: Roupa As Factories devem montar um manequim que faça pernas: RoupaPernas
pes: Roupa sentido, mas não existe controle explicito de tipos. Existe pes: RoupaPes Em nosso contexto uma famíla é composta por 1 objeto do tipo
apenas uma convenção que cada factory sabe como criar RoupaTronco, 1 do tipo RoupaPernas e outro do tipo
determinados objetos, no nosso caso, Manequim. RoupaPes.
Calcas Bermuda
Calcas <<interface>> Bermuda
RoupaPernas
designpatterns.com.br 27
Abstract Factory
Factory Method Abstract Factory
Manequim <<interface>>
Manequim RoupaTronco
<<interface>> tronco: RoupaTronco
tronco: Roupa Roupa pernas: RoupaPernas
pernas: Roupa pes: RoupaPes
pes: Roupa <<interface>>
RoupaPernas
<<interface>>
RoupaPes
Aqui nós temos um método abstrato que TrajeFactory
ManequimFactory
cria um objeto.
designpatterns.com.br 28
Abstract Factory
<<interface>>
criarRoupaTronco(): RoupaTronco
TrajeFactory é a Abstract Factory.
criarRoupaPes(): RoupaPes
<<interface>>
RoupaPernas
TrajeFactoryFormal TrajeFactoryCasual
<<interface>>
RoupaPes
TrajeFactoryFormal
TrajeFactoryCasual cria
cria uma família que
uma família que contém
contém os objetos
os objetos das classes
das classes Camisa, Sapatos Tenis
Camiseta, Bermuma e
Calcas e Sapatos.
Tenis.
designpatterns.com.br 29
Abstract Factory
A escolha da fábrica abstrata determina quais objetos serão criados.
construtor(TrajeFactory factory)
TrajeFactory
criarRoupaTronco(): RoupaTronco
Abstract Factory
Os métodos de criarRoupaPernas(): RoupaPernas Os métodos de
TrajeFactoryFormal TrajeFactoryCasual
criarRoupaPes(): RoupaPes
serão chamados no serão chamados no
contrutor da classe contrutor da classe
Manequim. Manequim.
Factories Concretas
TrajeFactoryFormal TrajeFactoryCasual
Se no futuro surgirem
criarRoupaTronco(): Camisa criarRoupaTronco(): Camiseta novos trajes, bastará
criar novas Factories
criarRoupaPernas(): Calcas criarRoupaPernas(): Bermuda contretas.
criarRoupaPes(): Sapatos criarRoupaPes(): Tenis
designpatterns.com.br 30
Abstract Factory DIAGRAMA DE CLASSES
ILUSTRADO
<<interface>>
RoupaTronco
Cliente Manequim
tronco: RoupaTronco
criarManequimFormal(): Manequim pernas: RoupaPernas
pes: RoupaPes Camiseta
Camisa
criarManequimCasual(): Manequim
construtor(TrajeFactory factory)
TrajeFactoryFormal TrajeFactoryCasual
designpatterns.com.br 31
MÓDULO 05
PADRÃO ESTRUTURAL
Facade POO
designpatterns.com.br 32
Facade
A DEFINIÇÃO
O padrão Facade fornece uma interface unificada para um conjunto de
interfaces em um subsistema. O Facade define uma interface de nível
mais alto que facilita a utilização do subsistema.
Tronco
Perna Perna
Esquerda Direita
designpatterns.com.br 33
Facade
O Cliente precisa de um Robô.
Cabeca
criar
Cliente2 BracoEsquerdo
criar
BracoDireito
ClienteN
Tronco
criar
O Cliente 2 ainda não precisa
de um robô. Porém, se ele vir a criar montarRobo
precisar, também terá que
conhecer todas as classes e Qualquer cliente que vier a
processos envolvido na precisar de um Robô terá que
montagem de um robô. PernaEsquerda PernaDireita conhecer todo esse processo.
criar criar
designpatterns.com.br 34
Facade DIAGRAMA DE CLASSES
ILUSTRADO
1
A classe Facade externaliza todo o subsistema
Cliente Cliente2
... ClienteN
robô de uma forma simplificada.
criar
robô. 3
BracoDireito Embora a classe Facade simplifique o acesso, as
Tudo o que é
criar classes do subsistema continuam acessíveis. O
Tronco refente a robô
Facade é uma alternativa simplificada.
fica aqui dentro.
criar
Veja por exemplo que a classe ClienteEspecifico
precisa apenas das pernas do robô. Ela pode
Um subsistema pode possuir mais de acessar as classes diretamente, sem a
PernaEsquerda PernaDireita
uma classe de fachada (Facade) intermediação da classe Facade.
criar criar
Para manter a explicação simples, a classe Facade do exemplo possui apenas um método
que engloba todas as classes do subsistema.
ClienteEspecífico É importante dizer que a classe Facade pode possuir quantos métodos forem necessários.
Cada método pode simplificar o acesso a algumas classes apenas, não necessariamente a
3 todas as classes do subsistemas.
designpatterns.com.br 35
MÓDULO 06
PADRÃO COMPORTAMENTAL
designpatterns.com.br 36
Template Method
A DEFINIÇÃO
O padrão Template Method define o esqueleto de um algoritmo dentro
de um método, transferindo alguns de seus passos para subclasses. O
Template Method permite que as subclasses redefinam certos passos
de um algoritmo sem alterar a estrutura do mesmo.
POO
O EXEMPLO
Pão
Deseja-se garantir que os ingredientes dos hambúrgueres sejam
Acompanhamento montados sempre na mesma ordem, porém os ingrediente
Queijo podem variar.
Hamburguer
Salada
designpatterns.com.br 37
Template Method DIAGRAMA DE CLASSES
ILUSTRADO
designpatterns.com.br 38
MÓDULO 07
PADRÃO ESTRUTURAL
Adapter
POO
designpatterns.com.br 39
Adapter
A DEFINIÇÃO
Converter uma interface de uma classe (incompatível) para outra
interface que o cliente espera encontrar. O Adapter busca permitir que
classes com interfaces incompatíveis trabalhem juntas.
POO
O EXEMPLO
Para ter uma conexão mais rápida deseja-se ligar um cabo
Ethernet em um notebook que possui apenas portas USB.
designpatterns.com.br 40
Adapter
Toda a complexidade do O adaptador converte uma interface
processo de adaptação fica incompatível em compatível
dentro do adaptador (Adapter)
designpatterns.com.br 41
Adapter DIAGRAMA DE CLASSES
ILUSTRADO
1 5
Essa é nossa interface ALVO. O Aqui acontece o processo de
CLIENTE espera receber uma ADAPTAÇÃO. Cada método do ADAPTER
interface que tenha 1 método
laranja, 1 vermelho e outro verde.
chama seu equivalente na classe
ADAPTADA, recupera o retorno e o
6
fornece ao CLIENTE seguindo as
restrições impostas pela interface ALVO.
3
A classe ADAPTER implementa a
interface alvo, logo, ela deve ter os
métodos (cores) que a interface
Alvo define.
3 2
Adapter Adaptada
4
O CLIENTE aceita objetos de
qualquer classe que implemente a
interface alvo. Ele sabe que a
interface alvo garante os métodos
nas cores que ele precisa.
Esse é nosso adaptador A classe adaptada é
Os métodos estão sendo equivalente ao cabo Ethernet
representados por cores (Classe incompatível)
designpatterns.com.br 42
MÓDULO 08
PADRÃO COMPORTAMENTAL
State POO
designpatterns.com.br 43
State
A DEFINIÇÃO
O padrão de projeto State permite que um objeto altere o seu
comportamento quando o seu estado interno muda. O objeto parecerá
ter mudado de classe.
POO
O EXEMPLO
Gerenciar as interações do usuário com um Smartphone de
acordo com seus possíveis estados.
designpatterns.com.br 44
State
Considere que o Smartphone pode estar nos seguintes estados:
designpatterns.com.br 45
State
Vamos utilizar uma Máquina de Estados para ilustrar o comportamento do Smarthpone
designpatterns.com.br 46
State
O padrão State sugere que cada estado se torne um objeto de estado. Para existir um
Senha não
objeto é preciso que exista uma classe.
Validada
Bloqueado Desbloqueado Travado
Senha
Validada
Bloqueado Desbloqueado
Bloquear
Travar
Destravar
O padrão também sugere que cada transição se torne um Método dos objetos de estado.
designpatterns.com.br 47
State
Senha não
Validada
Senha
Validada Além disso, todos os objetos de estado devem <<interface>>
ser exergados da mesma forma pelo sistema. State
Bloqueado Desbloqueado
Eles precisam ter um tipo em comum. Todos
Bloquear senhaValidada()
precisam implementar uma mesma interface.
Travar senhaNaoValidada()
Destravar
bloquear()
travar()
Travado
destravar()
No método travar pode existir um timer que após 10 segundos senhaNaoValidada() senhaNaoValidada() senhaNaoValidada()
Por outro lado, as funcionalidades descritas acima não fazem destravar() destravar() destravar()
designpatterns.com.br 48
State
Senha não
<<interface>> Validada
State
Senha
senhaValidada()
Validada
senhaNaoValidada()
Bloqueado Desbloqueado
bloquear()
Bloquear
travar()
Travar
destravar() Destravar
Travado
Quando existe transição a partir de um determinado estado, o método da transição possui implementação.
Quando não exite transição a partir de um determinado estado, o método da transição lança um erro.
Por exemplo: A partir do estado Desbloqueado não existe nenhuma transição Senha Validada, logo, o método senhaValidada da classe
Desbloqueado lança um erro.
designpatterns.com.br 49
State DIAGRAMA DE CLASSES
ILUSTRADO
Objeto de
O objeto de contexto é o contexto
objeto que troca de estado. <<interface>>
Smartphone State Para que os objetos de
No nosso caso a instância
estado possam trocar o
da classe Smartphone. bloqueadoState: State
desbloqueadoState: State
senhaValidada() estado atual do
travado: State senhaNaoValidada() Smartphone (objeto de
estadoAtual: State contexto) eles precisam
bloquear()
conhecer o Smartphone.
this.estadoAtual.senhaValidada(); contrutor() travar() Portanto, os objetos de
senhaValidada() destravar()
estado devem receber o
objeto Smartphone em
this.estadoAtual.senhaNaoValidada(); senhaNaoValidada()
seu construtor.
bloquear()
this.estadoAtual.bloquear(); travar()
destravar()
O estado inicial do objeto Smartphone Todos os objetos de estado são inicializados recebendo o
fica definido como sendo Bloqueado. próprio objeto Smatphone como parâmetro.
designpatterns.com.br 50
State DIAGRAMA DE CLASSES
ILUSTRADO - CONTINUAÇÃO
Travado
Smartphone <<interface>>
State smartphone: Smartphone
senhaNaoValidada()
bloquear()
Desbloqueado
Alguns detalhes da classe Smartphone e
da interface State foram ocultados para smartphone: Smartphone
senhaNaoValidada()
destravar()
designpatterns.com.br 51
MÓDULO 09
PADRÃO COMPORTAMENTAL
Observer POO
designpatterns.com.br 52
Observer
A DEFINIÇÃO
O Observer é um padrão de projeto de software que define uma
dependência um-para-muitos entre objetos, de modo que quando um
objeto muda seu estado, todos os seus dependentes são notificados e
atualizados automaticamente.
POO
O EXEMPLO
Manter objetos leitores atualizados sobre as noticias que outro
objeto jornalista publica.
designpatterns.com.br 53
Observer
O problema da abordagem ao lado é a
sobrecarga de solicitações Esse objeto não
deseja receber as
desnecessárias ao objeto Jornalista. Esse objetos Leitores
novidades
desejam se manter
Por exemplo, suponha que uma nova atualizados das ultimas
notícia levou 60 segundo para ser notícias.
a 10s de?
publicada. Nesse tempo cada objeto A cad a novida
Objeto Leitor A
Leitor fez 6 solicitações para o objeto algum A cada 10 segundos eles
Tem
Jornalista. Somente a ultima solicitação A cada 10s
ade? perguntam para o objeto
retornou uma notícia, portanto, cada Tem alguma novid
A ca
jornalista se alguma noticia
objeto fez 5 solicitações desnecessárias. Tem algumda 10s
a novidade? foi lançada.
Objeto Leitor B
Tem
Outro ponto, é a quantidade de objetos alguA cada 10 Eles devem saber para
Objeto Jornalista ma n s
ovid
Leitores. Quanto mais Leitores existirem, ade? quem perguntar sobre
maior será a quantidade de solicitações Objeto Leitor C novas notícias. Portanto, o
desnecessárias. objeto Jornalista deve ser
conhecido pelos objetos
Por exemplo, em 60 segundo cada objeto Leitores.
Objeto Leitor D
faz 6 solicitações. logo: Esse objeto não
4 objetos Leitores fazem 24 deseja receber as
solicitações. novidades
10 objetos leitores fazem 60
solicitações.
Aqui, muitos objetos dependem de 1 único objeto. Muitos Leitores dependem de apenas
1 Jornalista. (Dependencia muitos-para-um)
designpatterns.com.br 54
Observer
O padrão de projeto observer propõe que os objetos observadores possam pedir ao objeto de interesse que os notifiquem sempre que ele sofrear alguma atualização.
Para tornar essa abordagem possível é preciso que exista um acordo entre o Subject (Jornalista) e Observers (Leitores):
Observers:
Precisam fornecer um canal para que o Subject os notifiquem.
Precisam conhecer o Subject que desejam observar.
Subject:
Esse objeto não
Precisa fornecer um canal para que os observers possam se cadastrar como observadores. deseja receber as
E também um canal para que os Observers possam se descadastrar como observadores. novidades
Deve ser capaz de notificar todos os observers quando sofrer uma atualização (nova noticia).
Objetos Observadores
(Observers)
Graças ao padrão Observer, agora não existe mais LeitorTipo1
o problema de solicitações desnecessárias
de
ovida
Objeto que gera o assunto de interesse nho n Objeto Leitor A
ora eu te
(Subject) ag
Hey, Os objetos Leitores
o novidade
Hey, agora eu tenh (Observers) podem ser
Hey, agora eu instâncias de classes
tenho novidad Objeto Leitor B
e diferentes
Hey,
agora
eu te
Objeto Leitor A Objeto Jornalista nho LeitorTipo2
novid
Objeto Leitor B ade
Objeto Leitor C
Objeto Leitor C
Objeto Leitor D
Sempre que uma nova
Lista de objetos notícia é lançada o
que pediram para Jornalista notifica Objeto Leitor D
serem notificados todos os leitores que se
inscreveram
Aqui, 1 objeto Jornalista depende de muitos objetos leitores. Esse objeto não
(Dependencia um-para-muitos) deseja receber as
novidades
designpatterns.com.br 55
Observer
O padrão de projeto observer propõe que os objetos observadores possam pedir ao objeto de interesse que os notifiquem sempre que ele sofrear alguma atualização.
Para tornar essa abordagem possível é preciso que exista um acordo entre o Subject (Jornalista) e Observers (Leitores):
Observers:
Ser capaz de notificar todos os observers quando sofrer uma atualização. 5 <<interface>> <<interface>>
Subject Observer
3 senhaValidada() observer)
inscrever(Observer senhaValidada() noticia)
receberNoticia(string 1
senhaValidada() observer)
desinscrever(Observer 4
5 notificar()
LeitorTipo1 LeitorTipo2
Jornalista
2 jornalista: Jornalista | null 2 jornalista: Jornalista | null
listaObservers: array
receberNoticia(string noticia) receberNoticia(string noticia)
inscrever(Observer observer)
senhaValidada() observer)
desinscrever(Observer
notificar()
designpatterns.com.br 56
Observer
Um pouco de código para exemplificar
/*
Adiciona o observer recebido por parâmetro ao array (ou
<<interface>> <<interface>>
outra estrutura de dados) listaObservers.
Subject Observer
Aqui você pode adicionar manualmente ou utilizar um senhaValidada() observer)
inscrever(Observer senhaValidada() noticia)
receberNoticia(string
método add(), push(), append() ou qualquer outro método
fornecido pela sua linguagem de programação favorita. senhaValidada() observer)
desinscrever(Observer
/* senhaValidada() observer)
desinscrever(Observer
Remove o observer recebido por parâmetro do array (ou
outra estrutura de dados) listaObservers. notificar()
Aqui você pode remover manualmente ou utilizar um //Recebe a noticia e faz algo com ela (manipula ou armazena)
método remove() ou qualquer outro método fornecido pela
sua linguagem de programação favorita. Os padrões de projeto são proposta de desing de código. //O Jornalista pode se passado no construtor do observador
Raramente você seguira a implementação pura do padrão. public function construtor (Jonalista jornalista) {
O importante é remover o objeto observer a "lista" de this.jornalista = jornalista;
objetos a serem notificados. this.jornalista.inscrever(this);
É comum que existam diversas variações e adequações do
*/ }
código do padrão, porém, mantendo a ideia central que o
padrão dita.
//Para um maior nível de abstração
para cada objeto observer contido na listaObservers () { //Também, é possível esperar o super tipo Subject no construtor
/*Em algum lugar de seu código o objeto produz uma
Veja ao lado algumas formas diferentes de implementar o
//Nesse caso, o tipo do atributo no diagrama deveria ser trocado para "Subject | null"
noticia (string) e a envia para todos os observadores
processo de atribuição de um objeto Jornalista ao atributo public function construtor (Subject jornalista) {
que se inscreverem em sua lista.*/ jornalista dos Leitores (1 e 2). this.jornalista = jornalista;
chamar o método receberNoticia(noticia); this.jornalista.inscrever(this);
} Também repare no processo de inscrição dos Leitores }
(observers) em um objeto Jornalista.
//Um pouco mais baixo nível //Talvez seja interessante ter um método para gerenciar a observação de um Subject
foreach (listaObserver as observer) { public function observar (Subject jornalista) {
observer.receberNoticia(noticia); this.jornalista = jornalista;
} this.jornalista.inscrever(this);
}
designpatterns.com.br 57
MÓDULO 10
PADRÃO COMPORTAMENTAL
Visitor
"Eu visito classes para
deixá-las mais poderosas"
designpatterns.com.br 58
Visitor UM PRESENTE
PRA VOCÊ
Rabiscando
PADRÕES DE
PROJETO
AULA COMPLETA EM VÍDEO
E
APERT
Y
O PLA
VISITOR
designpatterns.com.br 59
Rabiscando
PADRÕES DE
PROJETO O SEU PRÓXIMO PASSO
O Rabiscando Padrões de Projeto é um
treinamento completo com tudo o que você
precisa para aplicar todos os 23 Design
Patterns clássicos da GoF em seus projetos.
SAIBA MAIS
Cliq u e a q ui
designpatterns.com.br 60
Deixe a sua avaliação
PODE POR POR FAVOR ME DIZER O QUE ACHO DO EBOOK?
POO
CLIQUE AQUI
PARA AVALIAR
designpatterns.com.br 61
Agradecimentos
Deixo aqui meu muito obrigado a todos os alunos do treinamento Rabiscando Padrões de
Projeto.
Graças a eles eu pude me dar ao luxo de reservar horas do meu trabalho para criar esse e-book
gratuito.
Também te agradeço querido leitor. Obrigado pelo seu download. Em uma época onde existe
POO
uma grande escassez de BONS profissionais no mercado, é sempre gratificante notar a busca
por entender os conceitos por trás do código.
Saber como resolver problemas é uma das maiores virtudes de nós desenvolvedores.
Linguagens e frameworks da moda vem e vão, mas os conceitos são sólidos. É que ai que estão
os Design Patterns.
designpatterns.com.br 62
Recomendações e Referências
Esses são alguns dos livros que de alguma forma influenciaram a produção deste e-book.
POO
designpatterns.com.br 63
Reflexão Final
Certa vez ouvi uma frase que me marcou. Infelizmente não lembro o nome do autor para dar os
créditos. Era algo assim:
Até a próxima!
designpatterns.com.br 64