Динамический выбор класса во время выполнения - PullRequest
0 голосов
/ 23 февраля 2011

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

if msg_type = "A"
  MsgAProcessor.execute(message);
else if msg_type = "B"
  MsgBProcessoror = execute(message);
....
....
....

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

На данный момент существует 3 обработчика сообщений

MsgAProcessor
MsgBProcessor
MsgBProcessor

Все три класса имеют метод с именем execute, который обрабатывает сообщение в егособственный путь.Я создал интерфейс с именем MsgProcessor и добавил в него метод execute ().

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

Есть ли лучший способ добиться того же?

Я хочу иметь возможность просто вызвать MsgProcessor.execute из интерфейса, и среда выполнения знает, какой класс реализации вызывать, основываясь на типе сообщения.

Ответы [ 3 ]

5 голосов
/ 23 февраля 2011
  1. Есть интерфейс Процессор , который имеет метод execute ().Все ваши три MsgProcessors реализуют это.
  2. Имеют отдельный класс ProcessorControl , который имеет метод submit (String message) .Всякий раз, когда приходит новое сообщение, вы просто делаете ProcessorControl.submit (message)
  3. Теперь у ProcessorControl есть метод addProcessor (Proccesor proc, String type), который добавляет процессоры в хеш-таблицу с типом какключ.Следовательно, каждому процессору теперь назначается тип.
  4. В методе отправки просто получите hashtable.get (type) .execute (proc)

Thisэто простой шаблон команды.

1 голос
/ 23 февраля 2011

Вскоре вы хотите использовать динамическую загрузку класса: Class.forName(THE CLASS NAME)

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

((Processor)Class.forName(className).newInstance()).execute()

1 голос
/ 23 февраля 2011

Вы можете использовать карту для сопоставления типа сообщения с обработчиком сообщений.Чтобы отделить реализации, вы можете использовать ServiceLoader: http://download.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html

...