2

我对Command Design Pattern感到两难。Receiver 是一个知道如何执行操作的类的接口。

在链接中给出的示例案例中,接收器类Stock Trade知道如何执行 2 个操作,StockTrade#buy并且StockTrade#sell. 这些操作对应于 2 个现有命令BuyStockOrderSellStockOrder.

但是,如果需要添加其他命令,例如FooStockOrderandBarStockOrder怎么办?然后,Receiver必须更改接口(以及所有现有实现),因此违反了开闭原则。

Receiver如何以(几乎)从未改变的方式解决这个问题?

4

1 回答 1

4

你忘记了你的SOLID原则,特别是依赖倒置

不要以某种方式定义你的接口,它特别期望一个具体的实现,比如,BuyStockOrderSellStockOrder

而是定义您的接口以期望像 一样的抽象CommandRequest,然后您将发送具体的实现,CommandRequest而无需更改您的接口。

然后你的Receiver实施可以决定如何处理它,当然处理这个问题的正确方法是使用策略模式,但我将把它留给你。

下面是一些代码作为一个简单的例子:

public class Receiver : IReceiver
{
    public CommandResult Process(CommandRequest request)
    {
        // Check the type of request and handle appropriately (or send to who can handle it)

        return new Result();
    }
}

public interface IReceiver
{
    CommandResult Process(CommandRequest request);
}

public abstract class CommandResult
{
    public bool Successful { get; set; }
}

public abstract class CommandRequest
{
}

public class Result : CommandResult
{
}

public class BuyStock : CommandRequest
{
    public string Name { get; set; }
    public decimal Value { get; set; }
}

public class SellStock : CommandRequest
{
    public string Name { get; set; }
    public decimal Value { get; set; }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var receiver = new Receiver();
        var result = receiver.Process(new SellStock { Name = "PAYPL", Value = 100.20m });

        Console.WriteLine(result.Successful ? "Yay!" : "Boo!");
    }
}
于 2015-03-03T22:02:49.533 回答