Java - шаблон проектирования обработчика сообщений - PullRequest
1 голос
/ 09 февраля 2012

Моя Java-программа будет получать сообщения с предопределенной структурой.Каждое сообщение имеет несколько полей, и следующее поле может иметь определенные значения (и должны обрабатываться определенным образом) в зависимости от текущего значения поля:

For example:

 1. FIELD1-FIELD2-CUSTOMDATA-OTHERDATA
 2. FIELD1-FIELD2-FIELD3-CUSTOMDATA-OTHERDATA

Здесь, в зависимости от типа FIELD1, определенное декодированиелогика должна работать дальше;Поэтому следует использовать определенный синтаксический анализатор.

Существует ли какой-либо шаблон проектирования для такого?

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

Мысли?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012
1 голос
/ 09 февраля 2012

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

interface MessageListener {
    void message1(String field2, Object customData, Object otherData);
    void message2(String field2, String field3, Object customData, Object otherData);
    // other message types
}


MessageListener ml = 
String firstField = getField();
switch(firstField) {
    case messageType1: {
        String field2 = getField();
        Object customData = getData();
        Object otherData = getData();
        ml.message1(field2, customData, otherData);
        break;
    }
    case messageType2: {
        String field2 = getField();
        String field3 = getField();
        Object customData = getData();
        Object otherData = getData();
        ml.message2(field2, field3, customData, otherData);
        break;
    }
    //parse other message types

    default:
        // report unknown message type.
}
1 голос
/ 09 февраля 2012

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

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

Одним из преимуществ этого подхода является то, что с JAX-RS и JAX-WS вы можете аннотировать свой класс сообщений таким образом, чтобы API автоматически конвертировали его в XML (возможно, также и в JSON?), Если вам нужно представить Ваше сообщение передается во внешние системы.

0 голосов
/ 09 февраля 2012

Это выглядит как хороший кандидат для State pattern для меня.

Ваш синтаксический анализатор будет иметь начальное состояние (реализацию абстрактного класса или интерфейса) и запрашивать это состояние для обработки следующего токена.

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

public interface State {
    State nextState(Context context, String token) throws UnexpectedTokenException;
    boolean isFinal();
}
...