Pessoal,
Sobre o design pattern memento, efetuei a implementação utilizando o State em conjunto, está certo?
public class Contrato
{
public DateTime Data { get; private set; }
public string Cliente { get; private set; }
public ITipoContrato Tipo { get; set; }
public ContratoHistorico Historico { get; set; }
public Contrato(DateTime data, string cliente)
{
Data = data;
Cliente = cliente ?? throw new ArgumentNullException(nameof(cliente));
Tipo = new StatusContratoNovo();
Historico = new ContratoHistorico();
}
private Contrato(DateTime data, string cliente, ITipoContrato tipo) : this(data, cliente)
{
Tipo = tipo;
}
public void Avanca()
{
Historico.Adiciona(SalvaHistoricoContrato());
Tipo.Avanca(this);
}
private Contrato SalvaHistoricoContrato()
{
return new Contrato(this.Data, this.Cliente, this.Tipo);
}
public override string ToString()
{
return $"Data: {Data}; Cliente: {Cliente}; Tipo: {Tipo}";
}
}
public interface ITipoContrato
{
void Avanca(Contrato contrato);
}
public class StatusContratoNovo : ITipoContrato
{
public void Avanca(Contrato contrato)
{
contrato.Tipo = new StatusContratoEmAndamento();
}
public override string ToString()
{
return "Novo";
}
}
public class StatusContratoEmAndamento : ITipoContrato
{
public void Avanca(Contrato contrato)
{
contrato.Tipo = new StatusContratoAcertado();
}
public override string ToString()
{
return "EmAndamento";
}
}
public class StatusContratoConcluido : ITipoContrato
{
public void Avanca(Contrato contrato)
{
throw new Exception("Contratos concluídos não pode ser avançado!");
}
public override string ToString()
{
return "Concluído";
}
}
public class StatusContratoAcertado : ITipoContrato
{
public void Avanca(Contrato contrato)
{
contrato.Tipo = new StatusContratoConcluido();
}
public override string ToString()
{
return "Acertado";
}
}
public class ContratoHistorico
{
public IList<Contrato> Contratos { get; private set; }
public ContratoHistorico()
{
Contratos = new List<Contrato>();
}
public void Adiciona(Contrato contrato)
{
Contratos.Add(contrato);
}
public Contrato GetContratoHistorico(int index)
{
return Contratos[index];
}
}
public class Program
{
public static void Main(string[] args)
{
var contrato = new Contrato(DateTime.Now, "luis");
Console.WriteLine(contrato);
contrato.Avanca();
Console.WriteLine(contrato);
contrato.Avanca();
Console.WriteLine(contrato);
contrato.Avanca();
Console.WriteLine(contrato);
Console.WriteLine("\n================================");
foreach (var item in contrato.Historico.Contratos)
{
Console.WriteLine(item);
}
}
}