Шаблон команды: клиент и вызывающий

В шаблоне команды:

Почему участник-клиент не должен быть того же класса, что и участник-вызывающий? Возможны ли сценарии, когда участник-клиент и участник-вызов могут быть одним и тем же классом?


person jds2501    schedule 20.05.2009    source источник
comment
Возможный дубликат Шаблон проектирования команд - Является ли Invoker необязательным?. Это раньше, но у другого больше информации.   -  person outis    schedule 19.07.2015


Ответы (3)


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

person David Yancey    schedule 20.05.2009

1) Основная ответственность Клиента заключается в правильном создании экземпляров объектов Invoker, Receiver и Command, а затем инициировании процедуры выполнения в соответствующем месте и в соответствующее время.

Это может быть, например, что-то вроде этого

class Client {

...

invoker.executeCommand()

...

}

2) Основная ответственность Invoker заключается в вызове одного или нескольких команд-методов Command Object в определенном порядке.

Например,

class Invoker {

...
command.command1();
command.command2();
command.command3();
...

}

Рассмотрим, например, класс java.awt.event.KeyListener. Он имеет три метода, которые вызываются в следующем порядке:

keyPressed(KeyEvent e)
keyTyped(KeyEvent e)
keyReleased(KeyEvent e)

Класс Invoker для этого слушателя может быть:

class KeyInvocation {
    KeyListener listener;

    void invokeKey(EventObject e) {
        listener.keyPressed(e);
        listener.keyTyped(e);
        listener.keyReleased(e);
    }
}

Тем временем класс клиента должен правильно создавать экземпляры EventObject, KeyListener и KeyInvocation, а затем выполнять в нужном месте и в нужное время метод invokeKey.

Конечно, Invoker — это дополнительный слой паттерна Command. В более простом случае паттерна Command мы можем вообще пропустить класс Invoker и выполнить всю работу в Client.

person Vitaly    schedule 29.08.2015

Итак, давайте возьмем пример текстового редактора. Когда вы открываете приложение, приложение является клиентом, и оно будет хранить различные приемники и команды в своих вызывающих устройствах. например. Он добавит pasteCommand для вставки пункта меню, где получатель является документом. Он добавит openCommand в пункт меню открытия, где получателем является само приложение.

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

person Zen    schedule 02.12.2019