Pergunta

Eu tenho um aplicativo existente com uma interface de linha de comando que eu estou adicionando uma GUI para. Uma situação que muitas vezes surge é que eu tenho uma lista de objetos que herdam de uma classe, e precisam ser exibidas em uma lista, mas cada subclasse tem uma maneira ligeiramente diferente de ser exibido.

Não querendo ter declarações gigantes interruptor em todos os lugares usando reflexão / RTTI para fazer a exibição, cada classe sabe como retornar a sua própria cadeia de resumo que então é exibida na lista:

int position = 0;
for (vector<DisplayableObject>::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp)
    cout << ++position << ". " << iDisp->GetSummary();

funções similares estão lá para exibir informações diferentes em contextos diferentes. Este foi tudo muito bem e bom até que precisávamos para adicionar uma GUI. Uma cadeia não é mais suficiente -. Preciso criar controles gráficos

Eu não quero ter que modificar cada classe para ser capaz de exibi-lo em uma GUI -. Especialmente porque há pelo menos uma plataforma mais GUI que vai querer passar isso para

Existe algum tipo de técnica que pode ser usada para separar este código GUI para fora dos objetos de dados sem recorrer a RTTI e declarações switch? Seria bom para ser capaz de levar a cabo as funções getSummary também.

Idealmente, eu seria capaz de ter um heierarchy das classes de exibição que poderia tomar uma classe de dados e exibi-lo com base no tipo de tempo de execução em vez do tipo de tempo de compilação:

shared_ptr<Displayer> displayer = new ConsoleDisplayer(); 
// or new GUIDisplayer()

for (vector<DisplayableObject>::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp)
    displayer->Display(*iDisp);
Foi útil?

Solução

Eu não acho que isso vai resolver o seu problema de não precisar escrever o código, mas você deve ser capaz de abstrair a lógica GUI dos objetos de dados.

Olhe para um padrão Visitor ( http://en.wikipedia.org/wiki/Visitor_pattern) que vai permitir que você adicionar código a um objeto existente, sem alterar o objeto em si. Você também pode alterar o visitante baseado na plataforma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top