Fala meu querido, tudo bem? Dessa vez estou trazendo o décimo artigo da série “A Fábrica de Arquitetos” e hoje temos um padrão bem simples e fácil de entender, porém pode acabar sendo bem útil em determinados cenários.
Estou falando do padrão Memento, que como seu nome já diz nos traz uma lembrança de um objeto!
…
O que é?
Frequência de uso: 2/5 – Médio Baixo
O Memento pattern é um padrão de projeto comportamental que nos permite criar uma lembrança do estado de um objeto e se necessário restaurá-la no futuro durante a execução.
Então imagine o seguinte cenário, você está trabalhando em um sistema de vendas, onde seu cliente realizou seu pedido e iniciou o processo de geração de nota fiscal.
Após ele realizar o pedido ele precisou remover alguns itens, logo o processo de geração de nota removeu aqueles itens, o cliente indeciso, resolveu comparar ambas as notas para verificar o que cabia no orçamento.
Após a comparação ele decidiu que iria embolsar mais dinheiro e gostaria da nota antiga de volta, e aí que está o problema, como trazer um estado anterior do objeto de volta sem muita complexidade e acoplamento?
Memento é sua resposta! Guardando uma lembrança de um objeto antigo é possível restaurá-lo no futuro.
Logo abaixo vou deixar o UML do padrão.
…
Show me the code!
Bom, agora que a gente já entendeu que o objetivo do memento é literalmente guardar um estado anterior (lembrança ou momento) vamos aplicar isso no código!
Primeiramente vamos precisar da nossa entidade de nota fiscal.
Invoice.cs
Note que essa entidade tem 2 métodos, o SaveMemento e RestoreMemento, esses são os métodos que iremos utilizar para criar uma lembrança do objeto e restaurá-la quando necessário.
Note também que temos um objeto auxiliar chamado InvoiceMemento, que é um clone da entidade memento, porém ali você aplicar mais propriedades sem corromper o domínio, como por exemplo hora/dia da criação do Memento.
InvoiceMemento.cs
Por fim, precisamos do CareTaker, que como sua tradução já diz, serve como um zelador da lembrança, ela pode ser uma classe genérica contendo todas os objetos no qual você deseja aplicar o Memento e armazenar um estado.
CareTaker.cs
Agora vamos para nosso teste, como mencionado, vou criar uma nota, salvar seu estado, alterar essa nota e depois restaurá-la.
Program.cs
O seu resultado:
…
Conclusão
No artigo de hoje vimos um padrão muito eficiente quando o assunto é armazenar um estado anterior, lembrando, o Memento serve para somente UM estado anterior, caso você queira uma máquina de estado, eu indico o State Pattern!
Espero que tenha ficado claro qual a finalidade desse padrão e como ele pode nos ajudar.
Agradeço a atenção e bons estudos!!!!!
Caso precise entrar em contato, me mande uma mensagem aqui.
Baixe o projeto clicando aqui.