Шаблон команды:Клиент и Инвокер
-
23-08-2019 - |
Вопрос
В шаблоне команды:
Почему участник-клиент не должен быть того же класса, что и участник, вызывающий вызов?Возможны ли сценарии, когда участник-клиент и участник, вызывающий вызов, могут быть одним и тем же классом?
Решение
Основная причина в том, что это нарушает принцип единой ответственности.Как участник-Клиент, так и участник Invoker несут индивидуальную ответственность, и изменение одного повлияет на другое.
Другие советы
1) Основная ответственность Клиента заключается в правильном создании экземпляров объектов Invoker, Receiver и Command, а затем инициировании процедуры выполнения в соответствующем месте и времени.
Это может быть, например, что-то вроде этого
class Client {
...
invoker.executeCommand()
...
}
2) Основная обязанность Invoker — вызывать один или несколько командных методов командного объекта в определенном порядке.
Например,
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);
}
}
В то же время класс Client должен правильно создать экземпляр EventObject, KeyListener и KeyInvoction, а затем выполнить в нужном месте и в нужное время метод вызоваKey.
Конечно, Invoker — это дополнительный уровень шаблона Command.В более простом случае шаблона Command мы можем вообще пропустить класс Invoker и выполнить всю работу в Client One.