C#命令模式混乱

时间:2016-10-13 14:11:18

标签: c# design-patterns

我在不知不觉中一直在使用命令模式,其中客户端&调用者是相同的,他们直接调用命令。在查看DoFactory上的定义后,我有点困惑。

有各自的命令。这与我天真的理解并没有改变。我猜调用者只是调出所有命令。但是接收器的目的是什么?我不明白。

如果可能的话,有人可以给我一个包含多个命令以及如何实施的示例吗?

3 个答案:

答案 0 :(得分:1)

Command模式的基本意图是将某些类(具体的Command类)的基本(最重要)操作与其真正的使用者(CommandHandler)分离。

所以我们正在使用基于多态的解决方法。我们定义了一个抽象的 Command 类,它有一个名为void excecute(){}的方法,所以它不会因任何方法参数或返回类型而变得严格。因此具体的Command类可以在该方法中实现其特定于类的实现,并且CommandHandler可以自由地调用someCommandObject.execute();,而无需确切知道具体类是什么(作为Command类的实例就足够了)。因此调用和实现几乎是分离的。您可以在将来轻松引入另一个实现void execute(){}的具体Command类,CommandHandler仍然可以设法使用someCommandObject.execute();调用它。这就是Command模式的美妙。

我们在Java线程中的Thread.run()和C#线程中的Task.Run()完全相同。

虽然您可以根据自己的方便使用 Receiver ,但它有点偏离Command模式的大局。在您的计算器示例中,有一个 Receiver 是有意义的,因为所有具体的Command类都可以引用它来执行它们的主要操作(execute())。

您可以看到herethere中的一些示例,其中未使用Receiver。在有意义的地方使用接收器是完美的。但是不要把它与Command模式的真实交易混淆。 :))

答案 1 :(得分:0)

Command在这种模式中的参与并不重要,只是强调这样一个事实,即在非常简单的Receiver界面后面隐藏的具体命令对象可以做一件重要的事情甚至是事物实际上是由另一个对象(void execute())处理而不是命令对象本身。

确实,命令模式的要点是将一个复杂的任务封装到一个最小的接口(只是一个void方法 - Invoker - 不需要任何参数),以便一个或多个任务可以很容易存储并传递到任何地方,以便稍后由Invoker调用。这对Command非常方便,因为Command接口很小。

Runnable的一个明显例子是Java中众所周知的function findProfilesBySteamIds(ids, res) { var match = { $match: { $and : [ { steamid: { $in : ids } } ] } } var sort = { $sort: { createdAt : -1 } } var group = { $group: { _id : "$steamid", profile : { $first : "$$ROOT" }, personahistory : { $push : "$$ROOT" } } } SteamUser .aggregate([match, sort, group]) } 接口。

答案 2 :(得分:-1)

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!
*/