Pergunta

É possível implementar o Visitor Pattern respeitando a Open Princípio / Closed , mas ainda ser capaz de adicionar novas classes visitáveis?

O Princípio aberto / fechado afirma que "entidades de software (classes, módulos, funções, etc.) deve ser aberto para a extensão, mas fechado para modificação".

struct ConcreteVisitable1;
struct ConcreteVisitable2;

struct AbstractVisitor
{
   virtual void visit(ConcreteVisitable1& concrete1) = 0;
   virtual void visit(ConcreteVisitable2& concrete2) = 0;
};

struct AbstractVisitable
{
   virtual void accept(AbstractVisitor& visitor) = 0;
};

struct ConcreteVisitable1 : AbstractVisitable
{
   virtual void accept(AbstractVisitor& visitor)
   {
      visitor.visit(*this);
   }
};

struct ConcreteVisitable2 : AbstractVisitable
{
   virtual void accept(AbstractVisitor& visitor)
   {
      visitor.visit(*this);
   }
};

Você pode implementar qualquer número de classes que deriva AbstractVisitor: Está aberto para extensão. Não é possível adicionar uma nova classe visitable como as classes derivadas de AbstractVisitor não irá compilar:. É fechado para modificação

A árvore de classe AbstractVisitor aspectos OPEN / Princípio fechado. A árvore de classe AbstractVisitable não respeitar o princípio aberto / fechado, já que não pode ser estendida.

Existe alguma outra solução senão para estender a AbstractVisitor e AbstractVisitable como abaixo?

struct ConcreteVisitable3;

struct AbstractVisitor2 : AbstractVisitor
{
   virtual void visit(ConcreteVisitable3& concrete3) = 0;
};

struct AbstractVisitable2 : AbstractVisitable
{
   virtual void accept(AbstractVisitor2& visitor) = 0;
};

struct ConcreteVisitable3 : AbstractVisitable2
{
   virtual void accept(AbstractVisitor2& visitor)
   {
      visitor.visit(*this);
   }
};
Foi útil?

Solução

Em C ++, Acíclica Visitor (pdf) fica o que você quer.

Outras dicas

Você pode querer verificar para fora a pesquisa sobre "o problema expressão", ver por exemplo.

http://lambda-the-ultimate.org/node/2232

Eu acho que o problema é principalmente acadêmica, mas é algo que tem sido estudado muito, então há um pouco de coisas que você pode ler sobre diferentes maneiras de implementá-lo em línguas existentes ou com várias extensões de linguagem.

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