2

關於Command Design Pattern,我遇到了兩難的問題。接收器是知道如何執行操作的類的接口。使用命令設計模式添加新命令

在鏈接中給出的示例情況下,接收方類Stock Trade知道如何執行2個操作,StockTrade#buyStockTrade#sell。這些操作對應於2個現有命令,BuyStockOrderSellStockOrder

但是,如果需要添加其他命令,例如FooStockOrderBarStockOrder會怎麼樣?然後,Receiver接口將不得不被改變(以及所有現有的實現),因此違反開放 - 閉合原則。

如何解決這個問題的方式,Receiver是(幾乎)從未改變?

+0

這是否幫助? http://blog.everymansoftware.com/2012/01/command-invoker-pattern-with-openclosed.html – 2015-02-24 12:41:33

+0

不完全是因爲在提供的例子中,沒有實際的Receiver類,它應該是可響應的,以便實際執行與命令相對應的操作。 – Lopina 2015-02-24 13:23:09

回答

4

你忘了你的S.O.L.I.D原則,特別是Dependancy Inversion

不要在一個方式,它特別需要一個具體的執行力度像,BuyStockOrderSellStockOrder定義界面。

相反,定義您的界面以期望像CommandRequest這樣的抽象,您將發送具體的CommandRequest暗示,而不必更改界面。

然後你的Receiver implimentation可以決定如何處理它,當然正確的方式來處理這將使用Strategy Pattern但我會留給你。

下面是一些代碼作爲一個簡單的例子:

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!"); 
    } 
} 
+0

是的,你說得對,我忘了「D」:D – Lopina 2015-03-04 07:31:05