Шаблон команды — это один из шаблонов поведения, при котором запрос оборачивается внутри объекта как команда и этот объект передается вызывающей стороне, затем вызывающая сторона ищет соответствующий объект, который может обработать эту команду и передает команду соответствующему объекту, затем объект выполняет команду.
Это также соответствует твердому принципу OCP
Давайте возьмем пример фондового рынка, где Акция — это запрос на покупку или продажу (команда), эта Акция оборачивается Ордером, затем этот Ордер отправляется брокеру (Invoker ), затем брокер анализирует ордер, чтобы решить, является ли это ордер BuyOrder или SellOrder, и, наконец, выполняется ордер на покупку или продажу(выполнение команды/запроса)
Акции (запрос)
public class Stock { private String name ; private int quantity; public Stock(String n, int q){ this.name = n; this.quantity = q; } public void sell(){ System.out.println("[Sell order of quantity " quantity " for stock " name " has been performed]"); } public void buy(){ System.out.println("[Buy order of quantity " quantity " for stock " name " has been performed]"); } }
Порядок (запрос, заключенный внутри объекта в виде команды)
public interface Order { public void execute(); }
Конкретные заказы
public class BuyOrder implements Order { private Stock stock; public BuyOrder(Stock s){ this.stock = s; } @Override public void execute(){ stock.buy(); } } public class SellOrder implements Order { private Stock stock; public SellOrder(Stock s){ this.stock = s; } @Override public void execute(){ stock.sell(); } }
Брокер (Вызывающий объект, который выбирает соответствующий объект, способный обработать команду/ордер)
import java.util.ArrayList; import java.util.List; public class Broker { Listorders; public Broker(){ orders = new ArrayList(); } public void addOrder(Order e){ orders.add(e); } public void placeOrder(){ for(Order e : orders){ e.execute(); } orders.clear();// once all the orders are placed by the broker then, the list should be emptied } }
Основной
public class Main { public static void main(String args[]){ //requests Stock stock = new Stock("TCS",20); Stock stock2 = new Stock("Infy",10); //requests wrapped inside object(order) as commands Order order1 = new BuyOrder(stock); Order order2 = new SellOrder(stock2); //order is sent to the broker Broker broker = new Broker(); broker.addOrder(order1); broker.addOrder(order2); //broker at runtime decides the appropriate Object for the reference Order //in other words the invokers decide which object is appropriate and can handle this command/Order broker.placeOrder(); } }
Выход:
[Buy order of quantity 20 for stock TCS has been performed] [Sell order of quantity 10 for stock Infy has been performed]
Ключевые моменты этого шаблона
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3