代码之家  ›  专栏  ›  技术社区  ›  dalle

访客模式+开放/关闭原则

  •  16
  • dalle  · 技术社区  · 17 年前

    Visitor Pattern 尊重 Open/Closed Principle

    开放/关闭原则规定“软件实体(类、模块、函数等)应开放以供扩展,但应关闭以供修改”。

    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);
       }
    };
    

    您可以实现从AbstractVisitor派生的任意数量的类:它对扩展是开放的。您不能添加新的可访问类,因为从AbstractVisitor派生的类将不会编译:它将关闭以进行修改。

    AbstractVisitor类树尊重打开/关闭原则。 AbstractVisitable类树不遵守打开/关闭原则,因为它不能扩展。

    除了如下扩展AbstractVisitor和AbstractVisitable之外,还有其他解决方案吗?

    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);
       }
    };
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   jaco0646    7 年前

    在C++中, Acyclic Visitor (pdf)让你得到你想要的。

        2
  •  4
  •   Brian    17 年前

    你可能想看看关于“表达问题”的研究,参见。

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

    我认为这个问题主要是学术性的,但它已经被研究了很多,所以你可以阅读一些关于在现有语言或各种语言扩展中实现它的不同方法的资料。