шаблон команды для этого сценария? совет - PullRequest
2 голосов
/ 16 февраля 2011

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

По сути, у меня есть клиент, который формирует сокет-соединение с сервером.на моем сервере есть 1 класс 'foo', против которого клиент должен вызывать методы.

Допустим, у foo есть 5 методов, которые мой клиент вызовет.В прошлом я допустил ошибку при маршалинге объекта, который демаршалируется на сервере.Затем я проверяю переменную в объекте и, используя оператор switch, серверная логика может определить, какое действие следует вызвать.

Я хочу избежать этого, и поэтому я верю, что шаблон команд может мне помочь.но для моего примера класса 'foo' на сервере нужно ли создавать класс команд для каждого метода, который должен вызываться в foo?должен ли класс, отправляемый с клиента на сервер, быть командным классом?мне нужен только 1 приемник в этом случае?- класс фу?

большое спасибо за вашу помощь и извините за имя класса 'foo' здесь.У меня пока нет конкретных имен классов!

С наилучшими пожеланиями

1 Ответ

4 голосов
/ 16 февраля 2011

Независимо от того, что вы делаете, вы не сможете полностью избавиться от этого оператора switch ().Шаблон команды предлагает вам сделать следующее:

abstract class AbstractCommand() {
  abstract void execute();
}
class ConcreteCommand extends AbstractCommand {
  // execute implementation
}
// more command classes as needed; probably one per each of your method calls

Тогда у вас есть фабрика команд:

class CommandFactory {
  AbstractCommand createCommandForMessage(Message m) {
    // ... switch() goes here
  }
}

И ваша часть получения сообщений становится такой простой, как эта:

public class MessageReceiver {
  public void work() {
    while (true) {
      Message m = receiveMessage();
      AbstractCommand command = commandFactory.createCommandForMessage(m);
      command.execute();
    }
  }
}

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

...