Шаблон проектирования посетителей с GWT

У меня была идея, и она звучит так:

  1. Разобрать файл на стороне сервиса.
  2. Создайте список действий на основе содержимого файла.
  3. Передать список действий на сторону клиента.
  4. Попросите клиента определить и выполнить действия на основе элементов списка.

Как и в шаблоне посетителя, у нас будет класс для действий, и все они наследуют интерфейс действия. Затем клиенты реализовывали посетителей. В 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();
}

Проблема
Я не могу создать классы Proxy для интерфейсов Action и Visitor. Они не содержат сеттеров и/или геттеров. Плюс они не содержат никаких данных. Можно ли передать это знание того, какой метод следует вызывать в объекте посетителя из службы на сторону клиента?


person denarced    schedule 06.09.2012    source источник


Ответы (2)


Фабрика запросов может только перемещать данные (EntityProxy и/или ValueProxy) и просить сервер делать что-то от имени клиента (RequestContext).

Чтобы передать действия, клиент и сервер сначала должны поделиться знаниями о тех действиях, которые могут быть выполнены.

Тогда у вас есть два решения:

  • перейти на GWT-RPC
  • потому что клиент в любом случае должен заранее знать каждое возможное действие, создать перечисление или что-то еще, чтобы идентифицировать каждое действие, и передать эти идентификаторы клиенту, который сопоставит их с конкретными действиями для выполнения.
person Thomas Broyer    schedule 06.09.2012

Я не думаю, что именно так вы бы реализовали шаблон посетителя. я бы сделал что-то вроде этого

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

Затем я бы определил реализацию посетителя, выполняющего соответствующие действия.

Важно определить его таким образом, чтобы логика того, что делает посетитель, была внешней по отношению к классу. До этого у каждой реализации была своя реализация посетителя, поэтому изменить поведение было бы сложнее.

Я думаю, что это решит вашу проблему, потому что теперь логика того, что делать, экстернализируется для посетителя.

person Jeff Foster    schedule 06.09.2012
comment
Проблема не в самой схеме. Если мое понимание определения шаблона «Посетитель» неверно, то это не проблема. Основная проблема заключается в том, как передать интерфейс внутри GWT. - person denarced; 06.09.2012
comment
Единственный способ передать интерфейс в GWT (или сделать его доступным для классов GWT) — создать подкласс классов GWT и расширить их с помощью метода посетителя. - person Jeff Foster; 06.09.2012
comment
Вы имеете в виду подкласс ValueProxy или EntityProxy? - person denarced; 06.09.2012