Шаблон проектирования для обработки событий - PullRequest
6 голосов
/ 21 июня 2011

Я пытаюсь понять наиболее подходящий (Java) шаблон проектирования, используемый для обработки серии сообщений.Каждое сообщение включает в себя «тип», который определяет, как должны обрабатываться данные, содержащиеся в сообщении.

Я рассматривал шаблон Command, но изо всех сил пытаюсь понять роли / актуальность конкретных классов Command.Пока что я определил, что получатель будет содержать код, который реализует методы обработки сообщений.Конкретные команды будут создаваться в зависимости от типа сообщения.Однако я понятия не имею, как должны передаваться фактические данные сообщения.Должен ли он быть передан конструктору-получателю с соответствующими методами-приемниками, вызываемыми конкретной командой execute?Может быть, данные сообщения должны быть переданы в вызовах метода действия получателя?

Я довольно новичок во всем этом, поэтому любые рекомендации будут оценены.

Это может помочь:

public interface Command {
    public void execute(String msg);
}

public class AO1Command implements Command {

    Receiver rec = new Receiver();

    public void execute(String msg) {
        rec.admit(msg);
    }
}

public class CommandFactory {

    public protected CommandFactory () { }

    public static Command getInstance(String type)  {

       if (type.equals("A01")) return new A01Command();
       else if (type.equals("A02")) return new A02Command();
       else {
          return null; 
       }
}

Ответы [ 3 ]

3 голосов
/ 21 июня 2011

Хорошо, ваш заголовок содержит шаблон для обработки событий. Если вы говорите о реальной структуре событий, то вам на ум приходит модель Observer / Observable. Это сработает, если вы захотите запустить событие какого-либо типа, а затем обработчики событий начнут обрабатывать события.

Похоже, ваша проблема в деталях реализации шаблона команды. Можете ли вы опубликовать код, который показывает, где вы застряли?

Обратите внимание, что шаблоны не являются взаимоисключающими, вы можете использовать шаблон команды в контексте шаблона Observable.

РЕДАКТИРОВАТЬ - на основе вашего кода, вы должны

1) сделать CommandFactory статическим.
2) передать тип в метод getCommand, который также должен быть статическим.
3) Для этого вам не нужно размышлять, вы можете просто сделать

if (type == "type1") return new Command1();
else if (type == "type2") return new Command2();
...

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

1 голос
/ 21 июня 2011

Вы на правильном пути. Шаблон Command - это подходящее решение для обозначенной проблемы.

Чтобы ответить на ваш вопрос, вам нужно, чтобы ваша CommandFactory создала соответствующий экземпляр Command на основе дифференциатора данных (в данном случае некоторых данных в вашем сообщении). Затем вы вызываете метод для экземпляра Command, передавая ваше сообщение. Обычно это (лучшая) практика вызывать этот метод Execute (...), но вы можете вызывать его как хотите.

0 голосов
/ 21 июня 2011

Возможно, вы захотите взглянуть на проект Jakarta Digester (для обработки XML), он имеет реализацию SAX, который является API на основе событий, как описано здесь http://www.saxproject.org/event.html, это краткое объяснение, но может служить отправная точка для вас.

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