访客模式+开放/封闭原则
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和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
我认为这个问题主要是学术性的,但它已经被研究了很多,所以你可以阅读一些关于在现有语言或各种语言扩展中实现它的不同方法的内容。
相关文章:
- 开放 CV 中的动态内存分配,用于视频处理
- С++ wxWidgets:代码架构,设计原则和模式
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 我需要如何更改我的程序以使用打开/关闭原则?
- 复制赋值函数如何访问另一个对象的私有成员(Stroustroup 原则和实践书)?
- 开放CV垫"Sizes of input arguments do not match"的问题
- Visual Studio 2017扩展选项卡中的C++核心指导原则检查器丢失
- 我可以在C++中返回跨度吗?如果是这样,如何?(对替代方案开放
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 正交项目自由型开放
- 让流保持开放状态
- 混合开放MP/MPI代码中的多线程发送/接收时出错
- 分层状态机涉及哪些原则,以及如何实现基本模型?
- 如何找到最大长度间隔,即开放间隔的总和? c/c++
- Xaudio2与开放量
- 如何应用注册表模式使"select class depend on input"遵守开放封闭原则?
- 开放简历.检测多尺度() 函数返回错误
- QTextStream 无法使用开放模式写入文件,包括"t" QIODevice::Append
- 如何使用容器中对象的继承层次结构来维护开放/封闭原则
- 访客模式+开放/封闭原则