标签: visitor-pattern

如何将boost访问者概念与包含状态变量的类一起使用?

我正在尝试使用boost :: static_visitor在boost :: variant类型上实现影响某些变量状态的操作.我的方法是在命令访问者类中包含所有状态变量,但似乎这是不可能的.

这是我的代码示例:

#include <string>
#include <sstream>
#include <vector>
#include <boost/variant.hpp>
#include <boost/foreach.hpp>


struct TypeA
{
    int varA;
    int varB;
};

struct TypeB
{
   std::string varA;
   std::string varB;
};

typedef boost::variant<TypeA, TypeB> MyVariantType;

class MyCommandVisitor : public boost::static_visitor<>
{
public:
//These are just examples, the actions only need to be able to touch
// internal variables.
void operator()(TypeA & t) const
{
   m_runningSum += t.varA;
   m_outStream << "TYPEA ACTION: " << t.varB << std::endl;
}

void operator(TypeB …
Run Code Online (Sandbox Code Playgroud)

c++ boost visitor-pattern boost-variant

1
推荐指数
1
解决办法
3256
查看次数

Java访客模式

我尝试使用扩展类的访问者模式.我有动物类列表,每个动物都是不同的.当我给访问者打电话时,它只执行谈话(动物a),而不是对象的具体实例.见下文:

class Animal {}
class Cat extends Animal {}
class Dog extends Animal {}
class Poodle extends Dog {}

class Visitor {
    public void talk(Animal a) { System.out.println("?"); }
    public void talk(Cat a) { System.out.println("Meow"); }
    public void talk(Dog a) { System.out.println("bark"); }
    public void talk(Poodle a) { System.out.println("Arf"); }
}    

public class Demo{

    public static void main(String []args){
        Visitor visitor = new Visitor();
        Animal list[] = { new Cat(), new Dog(), new Poodle() };

        for (Animal a : list) …
Run Code Online (Sandbox Code Playgroud)

java visitor-pattern

1
推荐指数
1
解决办法
346
查看次数

迭代TObjectList

我有ObjectList容器,我想添加一个内部迭代器(访问者模式)实际上我正在尝试确定我的列表中的重复项.

样本:http://pastebin.com/pjeWq2uN

这段代码提供了我正在努力实现的目标.

TFindDuplicatesMethod = procedure(s1, s2: string) of object;

TPersonList = class(TObjectList)
public
  procedure Iterate(pMethode: TFindDuplicatesMethod)
end;

procedure TPersonList.Iterate(pMethode: TFindDuplicatesMethod)
var
  i: Integer;
begin
  for i := 0 to Count - 1 do
  pMethode(TMyClass(Items[i]).S1, {But i don't have the second parameter because
                               it comes from outside of PersonList Ex: OpenDialog.Files[i]})
end;

function FindDuplicate(S1, S2: string): Boolean;
begin
  Result := False;
  if S1 = S2 then
  Result := True;
end;

begin
  Files.Iterate(FindDuplicates(S1, S2));
end;
Run Code Online (Sandbox Code Playgroud)

我想知道OOP如何解决这个问题.

提前致谢...

delphi loops tobjectlist visitor-pattern delphi-2010

0
推荐指数
1
解决办法
4723
查看次数

升压::变体; 定义访客类

在Java中,我能够在不指定类型的情况下定义泛型类的变量.

class Tree<T extends Comparable<? super T>> {}
somewhere-else: Tree tree;
Run Code Online (Sandbox Code Playgroud)

然后我可以从文件中读取一些对象并将其类型转换为我想要的类类型.

tree = (Tree<String>) some object;
Run Code Online (Sandbox Code Playgroud)

随着boost::variant我已经开始变体的定义.

typedef boost::variant<Tree<std::string>, Tree<int>> TreeVariant; TreeVariant tree;
Run Code Online (Sandbox Code Playgroud)

我知道我需要指定一个visitor class但是从这个例子中不清楚如何定义它,以便我能够分配给我的tree变量Tree<std::string>或者Tree<int>.

然后我想从那里继续使用变量调用Tree的成员函数tree.

c++ visitor-pattern boost-variant

0
推荐指数
1
解决办法
1211
查看次数

解释器模式和访问者模式有什么区别?

我很难理解这两种设计模式。

您能否给我提供上下文信息或示例,以便我可以清楚地了解并能够映射两者之间的差异。

谢谢。

java design-patterns visitor-pattern interpreter-pattern

0
推荐指数
1
解决办法
910
查看次数

用两种不同的返回类型在Java中实现访客模式

我试图在具有对象具有不同返回类型(int和void)的方法的对象结构中实现Java的Visitor模式(家庭运动,对不起)。

ConcreteVisitor(即CostAss)返回int,第二个ConcreteVisitor(即drawCosts)返回void(即成本的打印)。

在此处输入图片说明

我有问题要了解如何实施此问题。我不允许在Employee接口中创建两个accept方法(一个int一个void)

在此处输入图片说明

java visitor-pattern

0
推荐指数
1
解决办法
52
查看次数

任何人都可以指导我一篇描述访客设计模式的优秀文章

如果代码是用Java编写的,那么任何人都可以引导我阅读描述访问者设计模式的优秀文章.

谢谢

java design-patterns visitor-pattern

-1
推荐指数
1
解决办法
433
查看次数

你怎么能在Scala中用访问者语义编写一个强大的Enum?

我经常使用一种模式来使代码更简单,我喜欢称之为Power Enum,它是一个利用访问者模式以及携带自定义数据的枚举.这是Java中的一个例子:

import java.security.SecureRandom;
import java.util.UUID;
import java.util.stream.IntStream;

public class PowerEnumDemo {
    private static final SecureRandom random = new SecureRandom();

    public static void main(String[] args) {
        for (int i = 0; i < 3 ; i++) {
            final Color selected = Color.values()[random.nextInt(3)];
            System.out.println("Selected: " + selected);
            System.out.println("rgb: " + selected.rgb);
            selected.visit();
        }
    }

    public enum Color {
        RED("0000ff") {
            @Override
            public void visit() {
                IntStream.range(1, 10).forEach(System.out::println);
            }
        },
        GREEN("00ff00") {
            @Override
            public void visit() {
                System.out.println(UUID.randomUUID().toString().chars().filter(c -> c == 'a').count()); …
Run Code Online (Sandbox Code Playgroud)

enumeration scala visitor-pattern

-1
推荐指数
1
解决办法
271
查看次数

C#中的静态(编译时/严格类型)多分派支持

我最近发现自己在我的代码中反复使用相同的模式.基本上它是访问者模式的变体,我用它来解析对派生类的基类实例的引用.这种方法需要大量的样板代码.

问题:

  • 如何在不写入大量访问者代码的情况下以静态/严格类型的方式在C#中多方式调度方法?
  • 是否有生成此代码的工具/扩展程序?
  • 为什么C#语言中没有任何内容可以解决多方调度?我不相信我是唯一发现这令人讨厌的人.我可能是非常错误的,问题不存在,所以我想知道你是怎么回事.

c# design-patterns programming-languages visitor-pattern multimethod

-2
推荐指数
1
解决办法
429
查看次数