-
Notifications
You must be signed in to change notification settings - Fork 0
Home
- Strategy
- Observer
- Template Method
- State
- Command
- Iterator
- Builder
- Singleton
-
Builder1: Classe Builder Interna
-
Builder2: Classe Builder Externa
-
Builder3: Classe Builder Gerada por Loombok
-
Builder4: Classe Builder Gerada por Immutables
Vídeos - Padrão Builder:
- annotations https://mvnrepository.com/artifact/org.immutables/builder/2.9.2
- annotations https://mvnrepository.com/artifact/org.immutables/value/2.9.2
<dependencies>
<!-- https://mvnrepository.com/artifact/org.immutables/builder -->
<dependency>
<groupId>org.immutables</groupId>
<artifactId>builder</artifactId>
<version>2.10.0-rc0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.immutables/value -->
<dependency>
<groupId>org.immutables</groupId>
<artifactId>value</artifactId>
<version>2.10.0-rc0</version>
<scope>provided</scope>
</dependency>
</dependencies>
- compilação https://projectlombok.org/features/Builder
Material Complementar:
- Vídeo
- Código do Vídeo
- Teoria
- https://howtodoinjava.com/design-patterns/creational/builder-pattern-in-java/
Extra: Singleton
Materiais Complementares:
- https://youtu.be/yimeXZ1twWs?si=4Jbj_uoZ95HrChMx
- https://www.youtube.com/watch?v=IXgE3jmwdk0&ab_channel=FullCycle
- https://www.youtube.com/watch?v=jInj68kINGE&ab_channel=RinaldoDev
- https://www.youtube.com/watch?v=glRKfsJStPY&ab_channel=FabioKon
- https://www.youtube.com/watch?v=8UrHhcyZYFM&ab_channel=LucasSilva
- https://www.youtube.com/watch?v=yimeXZ1twWs&ab_channel=C%C3%B3digoFonteTV
- https://www.youtube.com/watch?v=BBywfIrmd5M&ab_channel=HampliaConcursosTI
- https://javagoal.com/singleton-design-pattern/
- ❗ https://refactoring.guru/design-patterns/singleton
- ❗ https://refactoring.guru/design-patterns/singleton/java/example#example-2
Aula:
Vídeos:
Encontro Síncrono - Proxy - 18/11/21:
Links Complementares:
-
https://diogomoreira.gitbook.io/padroes-de-projeto/padrao-proxy
-
https://growthdev.com.br/design-pattern/padrao-de-projeto-proxy-em-php-com-exemplo/
Vídeos - Padrão Decorator:
Leitura Complementar:
-
https://brizeno.wordpress.com/category/padroes-de-projeto/decorator/
-
Como remover: https://stackoverflow.com/questions/55776160/how-to-remove-decorated-object-from-decorator-pattern
Iterator
Algumas linguagens de programação permitem que classes e objetos containers, ou seja, objetos que agrupam outros objetos, possam ser iteradosatravés do foreach sem a necessidade de expor a estrutura interna, seus índices e sua implementação. Eles são Conhecidos como objetos iteráveis, ou objetos que disponibilizam um Iterador (Iterator).
Intenção
Disponibilizar os objetos agregados para consulta através de iteração sem revelar a estrutura interna ou preocuparse com ela.
Motivação
Por vezes temos objetos tem que agregam coleções internas as quais não queremos revelar, ou seja, permitir que clientes externos modifiquem ou conheçam a estrutura desta lista.
Aplicabilidade
Utilize o padrão Iterator quando sua coleção tiver uma estrutura de dados complexa por debaixo dos panos, mas você quer esconder a complexidade dela de seus clientes (seja por motivos de conveniência ou segurança).
O iterador encapsula os detalhes de se trabalhar com uma estrutura de dados complexa, fornecendo ao cliente vários métodos simples para acessar os elementos da coleção. Embora essa abordagem seja muito conveniente para o cliente, ela também protege a coleção de ações descuidadas ou maliciosas que o cliente poderia fazer se estivesse trabalhando com as coleções diretamente.
Iterator no Java:
Exemplos de uso: O padrão é muito comum no código Java. Muitos frameworks e bibliotecas o usam para fornecer uma maneira padrão de percorrer suas coleções.
Aqui estão alguns exemplos das principais bibliotecas Java:
Todas as implementações de java.util.Iterator (também java.util.Scanner).
Todas as implementações de java.util.Enumeration.
Identificação: O iterador é fácil de reconhecer pelos métodos de navegação (como next, previous e outros). O código cliente que usa iteradores pode não ter acesso direto à coleção que está sendo percorrida.
Material Complementar:
Ex:
-
Controle de Automação Residencial
-
Controle de Rotas para Ambiente Web
O padrão de projeto Command possui várias características que o tornam uma escolha valiosa em muitos cenários de desenvolvimento de software:
- Desacoplamento: Separa o objeto que solicita a ação (invoker) do objeto que realiza a ação (receiver), promovendo um design mais modular e flexível.
- Extensibilidade: Facilita a adição de novos comandos sem alterar o código existente, seguindo o princípio aberto/fechado (Open/Closed Principle).
- Reversibilidade: Permite implementar facilmente operações de desfazer (undo) e refazer (redo), armazenando o histórico de comandos executados.
- Composição: Comandos podem ser compostos em comandos mais complexos, permitindo a criação de macros ou sequências de operações.
- Registro e Log: Facilita o registro e a auditoria de operações, já que cada comando pode ser registrado com detalhes específicos sobre a ação realizada.
- Flexibilidade: Permite parametrizar objetos com diferentes solicitações, tornando o sistema mais adaptável a mudanças.
Embora o padrão de projeto Command tenha muitas vantagens, ele também apresenta algumas características negativas que devem ser consideradas:
- Complexidade Adicional: A implementação do padrão Command pode adicionar complexidade ao código, especialmente em sistemas simples onde o padrão pode ser desnecessário.
- Sobrecarga de Objetos: Pode resultar em um grande número de classes e objetos, já que cada comando geralmente requer sua própria classe concreta.
- Manutenção: Com o aumento do número de comandos, a manutenção do código pode se tornar mais difícil, exigindo mais esforço para gerenciar e atualizar os comandos.
- Desempenho: Em sistemas com muitos comandos, o armazenamento e a execução de comandos podem impactar o desempenho, especialmente se houver necessidade de registrar ou desfazer muitas operações.
- Overhead de Memória: O armazenamento de estados para permitir operações de desfazer (undo) pode consumir uma quantidade significativa de memória, dependendo da complexidade das operações e da frequência com que são realizadas.
Essas desvantagens não anulam os benefícios do padrão Command, mas é importante considerá-las ao decidir se este padrão é adequado para o seu projeto específico.
Vídeos - Command:
Material Complementar:
- https://medium.com/xp-inc/design-patterns-parte-16-command-9c73af726c9c
- https://fjp.at/design-patterns/command
- https://www.codeprimers.com/command-design-pattern/
Bom
- desacopla a lógica de um estado da classe de contexto
- permite a criação de novos estados apenas adicionando novas classes
- elimina condicionais complexas da classe de contexto
Ruim
- se você tem apenas poucas condicionais simples, aplicar este padrão pode deixar seu código mais complexo do que o necessário
Vídeos:
Códigos:
Material Complementar:
Strategy vs State
The State and Strategy Patterns have the same class diagram, but they differ in intent. The Strategy Pattern typically configures Context classes with a behavior or algorithm, which can be done through composition during runtime. State Pattern allows a Context to change its behavior as the state of the Context changes.
https://acervolima.com/diferenca-entre-o-estado-e-o-padrao-de-design-de-estrategia-em-java/
Links:
- https://stacktips.com/tutorials/design-patterns/state-design-pattern-in-java
- https://www.codiwan.com/state-design-pattern-real-world-example-java/
- https://www.ashishvishwakarma.com/GoF-Design-Patterns-by-Example/State-Pattern/
- https://refactoring.guru/design-patterns/state
- https://refactoring.guru/pt-br/design-patterns/state
- https://medium.com/@gbbigardi/arquitetura-e-desenvolvimento-de-software-parte-16-state-aa998a86277f
- https://www.devmedia.com.br/design-patterns-state-parte-4/16783
- https://pt.wikipedia.org/wiki/State
- https://gist.github.com/rponte/2af6a9ce8b08949e9a88d7dbc58962fd
- https://appmaster.io/pt/glossary/padrao-de-estado
- https://devsubdev.wordpress.com/2010/05/18/state-pattern-parte-1/
- https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php/State_Pattern_(padr%C3%A3o_de_desenho)/Porta_Autom%C3%A1tica
- https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php/State_Pattern_(padr%C3%A3o_de_desenho)/Exerc%C3%ADcio_01:_Sem%C3%A1foro
- https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php/State_Pattern_(padr%C3%A3o_de_desenho)/Exerc%C3%ADcio_02:_M%C3%A1quina_de_Lavar
Exemplos:
- Relatório
- Template
- Algoritmos de Ordenação
- Cálculo do Frete
- Exportação/Conversão de Arquivos CSV
- Extração de dados de documentos de diversos formatos
- Gerador de templates HTML
- Gerador de Relatórios de diversas fontes: csv, banco de dados e etc.
Presentes:
- Erick
- Yuri
- Annie
- Jaime
- Ana Clara
- Gabriel
- Gabriel Barela
- Bruno
- Leticia
Padrão Template Method:
Slides:
Trabalho - Template Method:
Vídeos:
Diferença entre o Template Method e o Strategy:
-
https://github.com/IgorAvilaPereira/ppp2024_2sem/blob/main/slides/templatemethod_vs_strategy.pdf
Material Complementar:
-
https://brizeno.wordpress.com/category/padroes-de-projeto/template-method/
-
https://www.devmedia.com.br/padrao-de-projeto-template-method-em-java/26656
-
https://www.codingdrills.com/tutorial/design-patterns-tutorial/template-method-pattern
Painel Supermercado (Observer)
- opcional: Forma de Notificação (Strategy)
Estação Climática
Blog/Portal de Notícias
Controle de Telas - Sistema Financeiro
Exemplo comentado - Mudança de Temperatura (Ar condicionado)
Encontro Síncrono - Observer - 03/11/21:
Padrão Observer:
Vídeos:
Leitura complementar - Observer:
- https://www.thiengo.com.br/padrao-de-projeto-observer
- https://www.devmedia.com.br/padrao-de-projeto-observer-em-java/26163
Apresentação da disciplina
Os Padrões de Projeto são soluções já encontradas, experimentadas e testadas e que podem ser aplicadas a projetos sem ter que "reinventar a roda". Vários Padrões de Projeto foram catalogados e são um conjunto de melhores práticas que são seguidos e usados em projetos de software orientado a objetos.
Padrões de Projeto, basicamente, descrevem soluções para problemas recorrentes em sistemas de software orientado a objetos em desenvolvimento.
Além disso, os Padrões de Projeto também definem um vocabulário comum que facilitam o aprendizado e documentação de sistemas de software.
Os padrões de projeto são classificados como:
- Criacional - define a criação de objetos;
- Estrutural - define a composição de classes e objetos;
- Comportamental - define a interação entre classes e objetos.
Introdução - Padrão de Projetos
Padrão Strategy:
Exemplos:
-
https://github.com/IgorAvilaPereira/ppp2024_2sem/tree/main/codigos/DuckSimulation
-
https://github.com/IgorAvilaPereira/ppp2024_2sem/tree/main/codigos/StrategySort
Vídeos:
Conteúdo Complementar: