2011-01-01 3 views
0

コマンドデザインパターンを読んだ後、私は質問があります。コマンドデザインパターン

具体的なコマンドと受信者オブジェクトをクライアント上に作成する理由は何ですか?呼び出し元クラスで初期化できませんか?

私はクライアントが呼び出し元を作成し、呼び出し元にその要求を渡すべきだと思います。呼び出し元はすべてのものを処理する必要があります。これにより

  1. 私たちは、クライアントにあまり依存しています。
  2. クラス図のデザインは実際のデザインとはまったく異なります。

例 - クライアントは、株式の売買の注文を作成します。その後、注文はエージェントに送信されます。エージェントは注文を受け取り、StockTradeシステムに配置します。

ここでエージェントは呼び出し元であり、株式取引システムは受信者です。コマンド・デザイン・パターンどおり

public interface IOrder 
{ 
public abstract void execute (); 
} 

class StockTrade { 
    public void buy() { 
     System.out.println("You want to buy stocks"); 
    } 
    public void sell() { 
     System.out.println("You want to sell stocks "); 
    } 
} 

class Agent { 
    public Agent() 
    { 
    } 

    void placeOrder(IOrder order) { 
     order.execute(); 
    }  
} 

//ConcreteCommand Class. 
class BuyStockOrder implements Order { 
    private StockTrade stock; 
    public BuyStockOrder (StockTrade st) { 
     stock = st; 
    } 
    public void execute() { 
     stock . buy(); 
    } 
} 

//ConcreteCommand Class. 
class SellStockOrder implements IOrder { 
    private StockTrade stock; 
    public SellStockOrder (StockTrade st) { 
     stock = st; 
    } 
    public void execute() { 
     stock . sell(); 
    } 
} 

// Client 
public class Client { 
    public static void main(String[] args) { 
     StockTrade stock = new StockTrade(); 
     BuyStockOrder bsc = new BuyStockOrder (stock); 
     SellStockOrder ssc = new SellStockOrder (stock); 
     Agent agent = new Agent(); 

     agent.placeOrder(bsc); // Buy Shares 
     agent.placeOrder(ssc); // Sell Shares 
    } 
} 

は今のクラスは、受信機、具体的なコマンドおよびエージェントに依存しています。

受信者と具体的なコマンドの依存関係をクライアントから移動できませんか?

Agent Class 
class Agent { 
    public Agent() 
    { 
    } 

    void BuyStock(BuyStockRequest request) 
    { 
     IOrder order = new BuyStockOrder(); 
    order.execute(request); 
    } 

    void SellStock(SellStockRequest request) 
    { 
     IOrder order = new SellStockOrder(); 
    order.execute(request); 
    } 
} 

//ConcreteCommand Class. 
class BuyStockOrder implements IOrder { 
    private StockTrade stock; 
    public BuyStockOrder() { 
     stock = new StockTrade; 
    } 
    public void execute(BuyStockRequest request) { 
     stock.Name = request.Name; 
    stock.Price = request.Price; 
     stock.buy(); 
    } 
} 

//ConcreteCommand Class. 
class SellStockOrder implements IOrder { 
    private StockTrade stock; 
    public SellStockOrder() { 
     stock = new StockTrade; 
    } 
    public void execute(SellStockRequest request) { 
     stock.Name = request.Name; 
    stock.Price = request.Price; 
     stock.sell(); 
    } 
} 


//Request Class 
class BuyStockRequest 
{ 
    public string Name {get; set;} 
    public decimal price {get; set;} 
} 

class SellStockRequest 
{ 
    public string Name {get; set;} 
    public decimal price {get; set;} 
} 

Client 
public class Client { 
    public static void main(String[] args) { 
     BuyStockRequest request = new BuyStockRequest(); 
     request.Name = "XYZ"; 
    request.Price = 100; 
     Agent agent = new Agent(); 
     agent.BuyStock(request); // Buy Shares 
    } 
} 
+1

質問は意味がありません(私にとっては少なくとも)。あなたはもっと具体的になりますか? –

+0

私は例を挙げて質問を更新しましたが、今回はもっと明確になることを願っています。 – pchajer

答えて

1

実際には、いくつのコマンドがあるのか​​、呼び出し元から公開するインターフェイスの数が多いのですか。各コマンドごとに1つのインタフェースを公開することになった場合、最初にコマンドオブジェクトを作成するのはどうしても難しいことです。コマンドパターンのアイデア全体は、エージェントクラスが何も変更してはならないコマンドの数を増やすと、コマンドの数から呼び出し側ロジックを切り離すことです。