Вопрос

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

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

Это было полезно?

Решение

Основная причина в том, что это нарушает принцип единой ответственности.Как участник-Клиент, так и участник 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top