Образец команды: клиент и призыватель - PullRequest
1 голос
/ 20 мая 2009

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

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

Ответы [ 2 ]

4 голосов
/ 20 мая 2009

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

0 голосов
/ 30 августа 2015

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 one.

...