Diferentes consultas, mesma camada de apresentação

Bom dia.

Estou com problemas para resolver uma questão de permissões.

Em nossa aplicação o login do sistema pode assumir tem 2 papéis(Administrador ou Cliente), porem a camada de visualização é a mesma para ambos, mudando apenas o layout da pagina conforme as necessidades do papel.

O problema que estamos tendo é que os Managed Bean estão extremamente bagunçados verificando as permissões do login e retornando a consulta conforme as necessidades. Achamos que ficaria melhor arquitetado se tivéssemos algo como o exemplo abaixo:

public interface ConcultaMBean{
   public List consultaContasPagas();
}

public class AdministradorConsultaMBean implements ConcultaMBean{
  public List consultaContasPagas(){
    List list = new LinkedList();
    list.add(new Conta("A"));
    list.add(new Conta("B"));
    list.add(new Conta("C"));
    return list;
  }
}
public class ClienteConsultaMBean implements ConcultaMBean{
  public List consultaContasPagas(){
    List list = new LinkedList();
    list.add(new Conta("A",1200));
    list.add(new Conta("B",1220));
    list.add(new Conta("C",1300));
    return list;
  }
}

O problema dessa solução está em como definir qual Managed Bean será usado no jsf, particularmente gostaríamos de ter algo semelhante ao código abaixo.

<html>
...
<h:dataTable value="#{concultaMBean.consultaContasPagas}" var="clientPhone">
...
</h:dataTable>
...
</html>

O problema é que o concultaMBean é uma interface, não consegui identificar aonde eu poderia colocar uma Fabrica para escolher qual implementação deve ser carregada.
Alguém tem uma idéia de como resolver ou uma solução mais inteligente.
Desde já obrigado.

Olá,

Não sei se faz sentido, mas me diga você: isso é requisito de quem? Da UI? Onde vai usar isso? Eu entendi como requisito da UI, então não reflita esse requisito no seu código. Eu jogaria esse tratamento na UI e no meu serviço retornaria tudo da mesma forma. Teria um atributo de Login retornando o tipo do usuário e trataria ele a partir disso… Fui util? :stuck_out_tongue:

[]'s