В шаблоне команды:
Почему участник-клиент не должен быть того же класса, что и участник-вызывающий? Возможны ли сценарии, когда участник-клиент и участник-вызов могут быть одним и тем же классом?
В шаблоне команды:
Почему участник-клиент не должен быть того же класса, что и участник-вызывающий? Возможны ли сценарии, когда участник-клиент и участник-вызов могут быть одним и тем же классом?
Основная причина в том, что это нарушает принцип единственной ответственности. Участник Client и участник Invoker имеют индивидуальные обязанности, и изменение одного повлияет на другого.
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.
Итак, давайте возьмем пример текстового редактора. Когда вы открываете приложение, приложение является клиентом, и оно будет хранить различные приемники и команды в своих вызывающих устройствах. например. Он добавит pasteCommand для вставки пункта меню, где получатель является документом. Он добавит openCommand в пункт меню открытия, где получателем является само приложение.
Это точно отвечает на ваш вопрос, чем могут отличаться вызывающий и клиент.