1

我有一个想法,它是这样的:

  1. 在服务端解析文件。
  2. 根据文件内容创建操作列表。
  3. 将操作列表传递给客户端。
  4. 让客户根据列表中的项目定义和执行操作。

与访问者模式一样,我们有一个用于操作的类,并且所有操作都继承了 Action 接口。然后,客户将实施访问者。在Java中它会是这样的:

public interface Action {
    void act(Visitor visitor);
}

public class PerfectAction implements Action {
    void act(Visitor visitor) {
         visitor.bePerfect();
    }
}

public class VisibleAction implements Action {
    void act(Visitor visitor) {
         visitor.beVisible();
    }
}

public interface Visitor {
    void bePerfect();
    void beVisible();
}

问题
我无法为 Action 和 Visitor 接口创建代理类。它们不包含 setter 和/或 getter。此外,它们不包含任何数据。是否可以将有关应在访问者对象上调用哪种方法的知识从服务传递到客户端?

4

2 回答 2

1

请求工厂只能移动数据EntityProxy和/或ValueProxy),并要求服务器代表客户端做事(RequestContext)。

要传输动作,客户端和服务器首先需要共享可以执行的那些动作的知识。

然后你有两个解决方案:

  • 迁移到 GWT-RPC
  • 因为客户端无论如何都必须预先知道所有可能的动作,创建一个枚举或其他任何东西来识别每个动作,并将这些标识符传输给客户端,客户端会将它们映射回要执行的具体动作。
于 2012-09-06T11:10:03.563 回答
0

我认为这不是您实现访问者模式的方式。我会做这样的事情

public interface ActionVisitor {
  void visit(VisibleAction va);
  void visit(PerfrectAction pa);
}

public class PerfectAction implements Action {
    void act(Visitor visitor) {
       visitor.visit(this);
    }
}

public class VisibleAction implements Action {
    void act(Visitor visitor) {
        visitor.visit(this);
    }
}

然后,我将定义执行适当操作的访问者的实现。

以这种方式定义它很重要,这样访问者所做的事情的逻辑就在类之外。在此之前,每个实现都有不同的访问者实现,因此更难改变行为。

我认为这将解决您的问题,因为现在做什么的逻辑已外部化给访问者。

于 2012-09-06T09:24:35.873 回答