Шаблон проектирования команд - PullRequest
0 голосов
/ 01 января 2011

После прочтения шаблона проектирования команд у меня возникает вопрос -

Почему мы создаем конкретный объект команды и получателя на клиенте.Разве это не может инициализироваться в классе invoker?

Я думаю, что клиент должен создать invoker и передать свой запрос invoker.Invoker должен позаботиться обо всем.

Делая это,

  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 Ответ

1 голос
/ 01 января 2011

На самом деле все сводится к тому, сколько у вас команд и сколько интерфейса вы хотите открыть из invoker. Если в итоге вы выставляете по одному интерфейсу для каждой команды, зачем сначала создавать объекты команд. Вся идея шаблона команд состоит в том, чтобы отделить логику вызова от числа команд, так как вы увеличиваете количество команд, в которых класс агента не должен подвергаться никаким изменениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...