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

Visitor Pattern + Open/Closed Principle

本文关键字:原则 开放 模式 访客      更新时间:2023-10-16

是否可以实现遵循开放/关闭原则的访问者模式,但仍然可以添加新的可访问类?

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

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和Abstractvistable之外,还有其他解决方案吗?

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

在C++中,非循环访问者(pdf)可以为您提供所需内容。

您可能想查看有关"表达式问题"的研究,例如

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

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