Основная цель шаблона Command - это развязка основной (наиболее важной) работы некоторых классов (конкретных классов команд) от их реального потребителя (CommandHandler).
Итак, мы используем работу, основанную на полиморфизме. Мы определяем класс команды, который имеет метод void excecute(){}
, поэтому он не становится жестким с любым параметром метода или типом возвращаемого значения. Таким образом, конкретные классы команд могут реализовать свою специфическую реализацию класса внутри этого метода, и CommandHandler может свободно вызывать someCommandObject.execute();
, не требуя знать, что именно этот конкретный класс (являющийся экземпляром класса Command достаточно). Таким образом, вызовы и реализации довольно развязаны. Вы можете легко ввести еще один конкретный класс Command в будущем, который реализует void execute(){}
, но CommandHandler может справиться с этим someCommandObject.execute();
. Это красота шаблона Command.
Это то же самое, что мы имеем в Thread.run()
в потоках Java и Task.Run()
в потоках C#.
Хотя вы можете использовать приемник , как вам удобно, это немного отличается от общей картины командного шаблона. В вашем примере калькулятора имеет смысл иметь приемник , поскольку все конкретные классы команд могут ссылаться на то, что они выполняют свою основную операцию (execute()
).
Вы можете увидеть несколько примеров из here и there, где приемник не использовался. Это более чем идеально подходит для использования приемника, где это имеет смысл. Но не путайте это с реальной сделкой.:))
Что точно не ясно вам? Индивидуальные обработчики команд или ...? – kayess
Я получаю отдельные команды. Это индивидуальная задача. Я не уверен, как «приемник» вписывается в картину. – Skadoosh
В моем предыдущем комментарии я имел в виду, что вы не можете получить, как работают обработчики команд (приемники в вашей формулировке)? Или вы ссылаетесь на события, вызванные обработчиками команд? – kayess