Utilizando o construtor ao invés do Setter eu fiz a seguinte implementação:
public class GeradorDeResposta
{
public void geraResposta(Conta conta, Requisicao requisicao)
{
Resposta resposta = new RespondeCsv(
new RespondeXml(
new RespondePorcento(
new SemResposta()
)
)
);
resposta.retornaConta(conta, requisicao);
}
}
public class RespondeCsv : Resposta
{
public Resposta Proxima { get; set; }
public RespondeCsv(Resposta proxima)
{
this.Proxima = proxima;
}
public void retornaConta(Conta conta, Requisicao requisicao)
{
if (requisicao.Formato == Formato.CSV)
{
Console.WriteLine(conta.NomeDoTitular + "," + conta.Saldo);
}
Proxima.retornaConta(conta, requisicao);
}
}
public class RespondeXml : Resposta
{
public Resposta Proxima { get; set; }
public RespondeXml(Resposta proxima)
{
this.Proxima = proxima;
}
public void retornaConta(Conta conta, Requisicao requisicao)
{
if (requisicao.Formato == Formato.XML)
{
Console.WriteLine("<Conta><Titular>" + conta.NomeDoTitular + "</Titular><Saldo>" + conta.Saldo + "</Saldo></Conta>");
}
Proxima.retornaConta(conta, requisicao);
}
}
public class RespondePorcento : Resposta
{
public Resposta Proxima { get; set;}
public RespondePorcento(Resposta proxima)
{
this.Proxima = proxima;
}
public void retornaConta(Conta conta, Requisicao requisicao)
{
if (requisicao.Formato == Formato.PORCENTO)
{
Console.WriteLine(conta.NomeDoTitular + "%" + conta.Saldo);
}
Proxima.retornaConta(conta, requisicao);
}
}
public class SemResposta : Resposta
{
public void retornaConta(Conta conta, Requisicao requisicao)
{
return;
}
}
Para "encerrar a corrente" eu não utilizei o construtor na classe SemResposta. Funcionou, porém eu gostaria de saber se essa é a melhor solução.