2016-10-13 3 views
1

Я, бессознательно, использовал шаблон команды, в котором клиент & тот же самый вызов, и они напрямую вызывают команды. Посмотрев определение на DoFactory, я немного смущен.C# Command Pattern confusion

Имеются отдельные команды. Это не изменилось с моего наивного понимания. Я предполагаю, что invoker просто вызывает все команды. Но какова цель получателя? Этого я не понимаю.

Если возможно, может ли кто-нибудь дать мне пример с несколькими командами и как это сделать?

+1

Что точно не ясно вам? Индивидуальные обработчики команд или ...? – kayess

+0

Я получаю отдельные команды. Это индивидуальная задача. Я не уверен, как «приемник» вписывается в картину. – Skadoosh

+0

В моем предыдущем комментарии я имел в виду, что вы не можете получить, как работают обработчики команд (приемники в вашей формулировке)? Или вы ссылаетесь на события, вызванные обработчиками команд? – kayess

ответ

0

Участие в этом шаблоне не имеет особого значения, просто подчеркнуть тот факт, что конкретный объект команды, замаскированный за очень простым интерфейсом Command, может сделать значительную вещь, и даже эта вещь фактически обрабатывается другим объектом (Receiver) не сам объект команды.

Действительно, точка командного шаблона состоит в том, чтобы инкапсулировать сложную задачу в минимальный интерфейс (только метод void - void execute() - который не требует каких-либо параметров), так что одна или многие задачи могут быть легко сохранены и переданы в любом месте для последующего вызова по Invoker. Это очень удобно для Invoker, так как интерфейс Command минимален.

Ярким примером Command является известный интерфейс Runnable на Java.

+0

Я думал, что приемник может быть настроен для связи с разными системами. Например, нам нужно создать новую учетную запись пользователя, но создание нового пользователя предполагает взаимодействие с двумя системами. В этом случае будут созданы две команды ... одна для связи с system1 и вторая для system2. Также будут созданы два приемника, один для команды 1, а другой для команды2. Теперь от клиента вы вызываете две команды, и они будут знать, как связаться с надлежащей системой и выполнить эту работу. Думаю ли я об этом правильно? – Skadoosh

+0

Да, правильно. Таким образом, если вы хотите, после создания двух команд вы можете отложить выполнение, просто сохранить или передать их где-нибудь, что где-нибудь, в подходящее время, будут выполняться команды, и новый пользователь будет создан. – Kata

1

Основная цель шаблона Command - это развязка основной (наиболее важной) работы некоторых классов (конкретных классов команд) от их реального потребителя (CommandHandler).

Итак, мы используем работу, основанную на полиморфизме. Мы определяем класс команды, который имеет метод void excecute(){}, поэтому он не становится жестким с любым параметром метода или типом возвращаемого значения. Таким образом, конкретные классы команд могут реализовать свою специфическую реализацию класса внутри этого метода, и CommandHandler может свободно вызывать someCommandObject.execute();, не требуя знать, что именно этот конкретный класс (являющийся экземпляром класса Command достаточно). Таким образом, вызовы и реализации довольно развязаны. Вы можете легко ввести еще один конкретный класс Command в будущем, который реализует void execute(){}, но CommandHandler может справиться с этим someCommandObject.execute();. Это красота шаблона Command.

Это то же самое, что мы имеем в Thread.run() в потоках Java и Task.Run() в потоках C#.

Хотя вы можете использовать приемник , как вам удобно, это немного отличается от общей картины командного шаблона. В вашем примере калькулятора имеет смысл иметь приемник , поскольку все конкретные классы команд могут ссылаться на то, что они выполняют свою основную операцию (execute()).

Вы можете увидеть несколько примеров из here и there, где приемник не использовался. Это более чем идеально подходит для использования приемника, где это имеет смысл. Но не путайте это с реальной сделкой.:))

+0

Хорошая работа +1! Я думал о CQS сначала ... :) – kayess

+1

@kayess действительно ценю вашу открытость :)) –

0

Простой пример команды Design Pattern в C#:

using System; 

interface ICommand { 
    void Execute(); 
} 

class Rifle : ICommand 
{ 
    public void Execute() 
    { 
     Console.WriteLine("Rifle is in action : Pif! Paf!"); 
    } 
} 

class Cannon : ICommand 
{ 
    public void Execute() 
    { 
     Console.WriteLine("Cannon is in action : Bum! Bam!"); 
    } 
} 

class Invoker 
{ 
    private ICommand _command; 
    public void SetCommand(ICommand command) 
    { 
     this._command = command; 
    } 

    public void Action() 
    { 
     _command.Execute(); 
    } 
} 

class Client 
{ 
    static void Main() 
    { 

     ICommand command0 = new Rifle(); 
     ICommand command1 = new Cannon(); 

     /////////////////////////////// 
     Invoker invoker = new Invoker(); 

     invoker.SetCommand(command0); 
     invoker.Action(); 

     invoker.SetCommand(command1); 
     invoker.Action(); 

     Console.ReadKey(); 
    } 
} 
/*output : 
Rifle is in action : Pif! Paf! 
Cannon is in action : Bum! Bam! 
*/