Padrões de projetos implementados em Java.
Tem o objetivo de fazer duas classes/interfaces incompatíveis trabalhem em conjunto através de abstrações para que não haja acoplamento entre elas. Pode ser usado para adaptar um código antigo que não se enquadre ao sistema atual.
Tem o objetivo de fazer a ponte entre dois sistemas/APIs através de abstrações, de forma que não haja acoplamento entre as partes.
Pode ser usado quando a classe tiver muitos atributos ou regras no construtor, facilitando e organizando a construção do objeto em uma nova classe, além de fornecer uma interface mais clara através dos métodos encadeados (method chain).
O padrão pode ser usado quando houver muitas condições, e diante de um encadeamento, o padrão percorre essas condições até encontrar uma que atenda a solicitação. O Chain of Responsability separa as responsabilidades em classes pequenas e enxutas, e ainda provê uma maneira flexível e desacoplada de juntar esses comportamentos novamente.
Pode ser usado quando queremos colocar em fila a execução de vários comandos de um objeto, fazendo com que esses comandos possam ser executados dinamicamente. Outro uso seria uma espécie de transação, onde a sequência de comandos só seria validada ou não, quando fossem executados métodos de rollback ou commit, por exemplo.
É recomendado o uso quando queremos compor comportamentos a outro comportamento de classes da mesma hierarquia. Isso pode ser definido no momento da instanciação, através do construtor.
Facilitar a criação de objetos que são complicados. Geralmente é um objeto que não precisa de parâmetros externos a ele para ser criado, a Factory já se encarrega de tudo que precisa para criação e te fornecer o objeto.
Quando temos uma grande quantidade de objetos similares a serem instanciados repetidamente, é ideal que uma classe seja responsável por esse controle, fazendo cache das instâncias para reuso.
Usado quando temos expressões que devem ser avaliadas, e a transformadas em uma estrutura de dados, para depois fazer com que a própria árvore se avalie.
O padrão faz com que os estados de um objeto sejam mantidos em uma lista/histórico/memória, para futura consulta e restauração dos estados anteriores. Com ele é possível fazer o famoso Ctrl+Z no objeto.
Uma classe Subject é quem mantém os dados compartilhados e uma lista de observadores que compartilham o dado. O Observer faz utilização dos dados compartilhados e deve ser atualizado a cada modificação no Subject. Recomendado quando tiver várias ações que compoem uma regra.
Manter e organizar estados de uma forma simples, separados em classes da mesma hierarquia, abaixo de uma interface que define os métodos que fazem a transição de estado.
Separa o que muda do que não muda em um software, de modo a evitar que o código tenha propagação de mudanças. Oferece uma maneira flexível para escrever algoritmos e alternar entre eles com base no objeto passado no construtor, fazendo com que a regra fique encapsulada e o cliente não precise conhecer essas regras, apenas saber qual usar.
Fornece uma maneira abtraída (template) de codificar uma regra baseada em uma interface, deixando as particularidades para as classes filhas que extenderem esse template.
É usado quando precisamos navegar sobre uma árvore de maneira organizada, realizando alguma tarefa.