2.1 Estado
State é um padrão de design comportamental. É utilizado nos casos em que, durante a execução do programa, o objeto deve mudar seu comportamento dependendo de seu estado.
![Estado](https://cdn.codegym.cc/images/article/0b64173f-b514-4ae1-a073-6cbb386a5716/800.jpeg)
O padrão consiste em 3 blocos:
Context é uma classe cujos objetos devem mudar seu comportamento dependendo do estado.
State é a interface que cada um dos estados concretos deve implementar. Por meio dessa interface, o objeto Context interage com o estado delegando chamadas de método a ele. A interface deve conter meios de feedback para o objeto cujo comportamento deve ser alterado.
Para isso, é utilizado um evento (padrão Editor - Assinante). Isso é necessário para substituir o objeto de estado durante a execução do programa quando ocorrerem eventos. Pode haver casos em que o próprio Contexto pesquisa periodicamente o objeto de estado para uma transição.
ConcreteState1, ConcreteState2 - classes de estados concretos. Deve conter informações sobre em quais condições e em quais estados o objeto pode passar do estado atual. Por exemplo, de ConcreteState1, um objeto pode ir para ConcreteState2 e ConcreteState3, e de ConcreteState2 de volta para ConcreteState1, e assim por diante. O objeto de um deles deve conter o Context quando criado.
Por exemplo, você está escrevendo um jogo onde um personagem pode correr, nadar e voar. Se o seu personagem entrou na água, é razoável limitar seu comportamento na água: agora ele não pode atirar, mas ainda tem algumas ações: nadar para frente, direita, esquerda, etc.
O estado do seu personagem pode ser descrito por um objeto State, que possui métodos que podem ser chamados e que farão algo. E depois que seu personagem entrou na água, basta mudar a referência para outro objeto State dentro dele - e ele muda de estado.
2.2 estratégia
Estratégia é um padrão de design comportamental para definir uma família de algoritmos, encapsulando cada um e tornando-os intercambiáveis. Isso permite que você escolha um algoritmo definindo a classe apropriada.
O padrão Strategy permite alterar o algoritmo selecionado independentemente dos objetos clientes que o utilizam.
![Estratégia](https://cdn.codegym.cc/images/article/673c4c44-ec33-4d4e-860f-399abc388d8d/800.jpeg)
O padrão Strategy permite que você use diferentes regras de negócios ou algoritmos, dependendo do contexto. É usado nos casos em que diferentes algoritmos devem ser usados no mesmo local, dependendo do estado atual do sistema (ou de seu ambiente).
Forças:
- encapsulamento da implementação de diversos algoritmos, o sistema torna-se independente de possíveis mudanças nas regras de negócio;
- chamando todos os algoritmos de uma maneira padrão;
- não usando switches e/ou instruções condicionais.
Esse padrão é um pouco semelhante ao padrão State, mas aqui a ênfase não está no estado, mas no comportamento. Digamos que um personagem em seu jogo possa trocar de arma. Então, ao trocar de arma, você pode simplesmente mudar a referência ao objeto que descreve como essa arma funciona.
2.3 Método de modelo
![Método de modelo](https://cdn.codegym.cc/images/article/be4df3de-e667-4f4d-9ea7-d3b021879bb2/800.jpeg)
Classe abstrata (abstract class) - define as operações abstratas que são substituídas nos herdeiros para implementar os passos do algoritmo; implementa um método de modelo que define o esqueleto do algoritmo. O método de modelo chama as operações substituídas e outras definidas na classe Abstract.
Classe concreta (classe concreta) - implementa as operações substituídas da maneira necessária para a implementação. A classe Concrete assume que os passos invariantes do algoritmo serão executados na AbstractClass.
Este padrão é frequentemente usado quando necessário:
- Uso único da parte invariante do algoritmo, deixando a parte modificável a critério dos herdeiros.
- Localização e isolamento de código comum a várias classes para evitar duplicidade.
- Permita que os herdeiros estendam o código apenas em determinados lugares.
Sim, esse padrão descreve o uso de um par: uma classe abstrata e sua implementação.
2.4 Cadeia de Responsabilidade
Cadeia de responsabilidade é um padrão de design comportamental projetado para organizar os níveis de responsabilidade em um sistema.
![Cadeia de responsabilidade](https://cdn.codegym.cc/images/article/41b55822-dc67-4db3-a0e8-b467bc9f320d/800.jpeg)
O modelo é recomendado para uso em condições em que:
- no sistema desenvolvido existe um grupo de objetos que podem processar mensagens de um determinado tipo;
- todas as mensagens devem ser processadas por pelo menos um objeto do sistema;
- as mensagens no sistema são processadas de acordo com o esquema “processe você mesmo ou passe para outro”, ou seja, algumas mensagens são processadas no nível em que foram recebidas, enquanto outras são encaminhadas para objetos de outro nível.
2.5 Lembrança
Keeper (Memento) é um padrão de design comportamental que permite corrigir e salvar o estado interno de um objeto sem violar o encapsulamento para que ele possa ser restaurado a esse estado posteriormente.
![Guardião (Lembrança)](https://cdn.codegym.cc/images/article/9b1d2d68-74b7-427c-8d7b-cf44640cf51f/800.jpeg)
O padrão Guardian é usado quando:
- é necessário salvar um instantâneo do estado do objeto (ou parte dele) para posterior restauração;
- A interface direta para obter o estado de um objeto expõe detalhes de implementação e quebra o encapsulamento do objeto.
GO TO FULL VERSION