当前位置: 首页 > 知识库问答 >
问题:

如何避免访问者模式实现的空(noop)方法?

白子明
2023-03-14

我有大量不同对象的集合,它们扩展了相同的基类A。为了将不同的算法应用于集合,我创建了一个IVisitor接口,该接口对A的每个子级都有一个Acc的方法。

一些实现IVisitor的访问者实际上使用了A的所有子级,但其中许多人没有,所以我最终会让访问者使用一堆我想避免的空(noop)方法。此外,每次我添加一个新的A子类时,我都需要向IVisitor添加一个新的接受方法,所有类都实现了它,这是访问者模式的一个常见问题。

我尝试实现选择性访问者模式,但我不喜欢投射对象,因为在我的情况下这可能是一个问题。

我也评估了这个问题,但它的答案并不真正针对问题。我想使用接口而不是抽象类,因为在我的情况下不允许多重继承

有没有办法避免这种麻烦并获得更干净的代码?

编辑:在这里你找到一个关于 Draw.io 的例子

共有1个答案

施季
2023-03-14

您可以定义一个新的模式;)对于你的情况:“选择性通用访问者”。在IVisit接口中只能有一个Visit方法,该方法接受带有从BaseClass继承的约束的泛型参数。

interface IVisitor<T> where T:BaseClass
{
    void Visit(T element);
}

然后,具体访问者可以指定泛型参数并实现访问方法。如果可以利用 IoC 容器(如 Autofac),它将您用作泛型类型的工厂,并且您可以通过请求 IVisitor 并将其传递给 Accept 方法调用来轻松获取正确的 Visitor 实例。

 类似资料:
  • 问题 你要处理由大量不同类型的对象组成的复杂数据结构,每一个对象都需要进行不同的处理。 比如,遍历一个树形结构,然后根据每个节点的相应状态执行不同的操作。 解决方案 这里遇到的问题在编程领域中是很普遍的,有时候会构建一个由大量不同对象组成的数据结构。 假设你要写一个表示数学表达式的程序,那么你可能需要定义如下的类: class Node: pass class UnaryOperator

  • 主要内容:介绍,实现,ComputerPart.java,Keyboard.java,Monitor.java,Mouse.java,Computer.java,ComputerPartVisitor.java,ComputerPartDisplayVisitor.java,VisitorPatternDemo.java在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行

  • 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行

  • 简介 访问者模式是一种将算法与对象结构分离的软件设计模式。 这个模式的基本想法如下:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方

  • 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图:主要将数据结构与数据操作分离。 主要解决:稳定的数据结构和易变的操作耦合问题。 何时使用:需要对一个对象结构中的对象进行

  • 访问者模式 不知不觉当中,我们就到了最后一种设计模式,即访问者模式。访问者模式,听上去复杂一些。但是,这种模式用简单的一句话说,就是不同的人对不同的事物有不同的感觉。比如说吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜欢这两种豆腐。四川的朋友可能更喜欢辣豆腐,江浙的人就可能对臭豆腐更喜欢一些。那么,这种情况应该怎么用设计模式表达呢? typedef struct _Tof

  • 亦称: Visitor 意图 访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体 (例如一座城市), 也能代表更精细的对象 (例如工业区和旅游景点等)。 如果节点代表的真实对象之间存在公路, 那么这些节点就会相互连接。 在程序内部, 每个节点的类型都由其所属的类来表示, 每个特定

  • 问题内容: 我只有一个班很多实例。每个实例都是其他几个实例的观察者。同样,每个实例也可以通过几个其他实例观察到。 如何避免在观察者中调用update()的无限循环? 问题答案: 您正在寻找一种检测循环的图遍历算法。一种简单的方法(仅在单线程方案中有效)是保持全局/静态计数器,以使每个顶级调用都获得唯一的标识符。然后,每个观察者都跟踪是否已经使用给定的标识符(ID)处理了更新,并且在这种情况下将其忽