После прочтения шаблона проектирования команд у меня возникает вопрос -
Почему мы создаем конкретный объект команды и получателя на клиенте.Разве это не может инициализироваться в классе invoker?
Я думаю, что клиент должен создать invoker и передать свой запрос invoker.Invoker должен позаботиться обо всем.
Делая это,
- Мы меньше зависим от клиента.
- Дизайн диаграммы классов полностью отличается отактуальный дизайн.
пример - клиент создает несколько заказов на покупку и продажу акций.Затем заказы отправляются агенту. Агент принимает заказы и размещает их в системе 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
}
}