Para o problema aprensentado, onde a aplicação cliente já pré selecionou qual formato gostaria de ver, não vejo a necessidade de um mecanismo de decisão como o padrão escolhido. Uma sugestão seria ter uma classe com "de-para" de formato com a classe que resolve o problema, e não passar uma por uma na cadeia para validar se aquela corresponde.
segue um exemplo:
<?php
class MapeamentoFormatador
{
private $dePara = array(
"1" => "XML",
"2" => "CSV",
"3" => "PORCENTO"
);
public function get($formato)
{
if (isset($this->dePara[$formato])) {
return new $this->dePara[$formato]();
}
throw new Exception("Formatador Inexistente", 1);
}
}
class Conta
{
private $nome;
private $saldo;
public function __construct($nome, $saldo)
{
$this->nome = $nome;
$this->saldo = $saldo;
}
public function getNome()
{
return $this->nome;
}
public function getSaldo()
{
return $this->saldo;
}
}
interface Formatador
{
public function getDadosFormatados(Conta $conta);
}
class XML implements Formatador
{
public function getDadosFormatados(Conta $conta)
{
return "<conta><titular>". $conta->getNome() ."</titular><saldo>". $conta->getSaldo() ."</saldo></conta>.";
}
}
class CSV implements Formatador
{
public function getDadosFormatados(Conta $conta)
{
return $conta->getNome() .";". $conta->getSaldo();
}
}
class PORCENTO implements Formatador
{
public function getDadosFormatados(Conta $conta)
{
return $conta->getNome() ."%". $conta->getSaldo();
}
}
$MapeamentoFormatador = new MapeamentoFormatador();
$formator = $MapeamentoFormatador->get(3);
echo $formator->getDadosFormatados(
new Conta("Alura", 500)
);