【问题标题】:Visitor design pattern with GWT使用 GWT 的访客设计模式
【发布时间】:2012-09-06 09:14:33
【问题描述】:

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

  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。此外,它们不包含任何数据。是否可以将有关应在访问者对象上调用哪个方法的知识从服务传递到客户端?

【问题讨论】:

    标签: java gwt visitor-pattern proxy-pattern


    【解决方案1】:

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

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

    然后你有两个解决方案:

    • 移至 GWT-RPC
    • 因为无论如何客户端都必须预先知道所有可能的操作,所以创建一个枚举或其他任何东西来标识每个操作,并将这些标识符传输给客户端,客户端会将它们映射回要执行的具体操作。

    【讨论】:

      【解决方案2】:

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

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

      然后我会定义一个执行适当操作的访问者的实现。

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

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

      【讨论】:

      • 问题不在于模式本身。如果我对访问者模式的定义的理解是错误的,那么这就是问题所在。主要问题是如何在 GWT 内部传输接口。
      • 将接口转移到 GWT(或使其可用于 GWT 类)的唯一方法是子类化 GWT 类并使用您的访问者方法扩展它们。
      • 您的意思是子类 ValueProxy 或 EntityProxy?
      猜你喜欢
      • 2012-03-10
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多