命令模式(Command Pattern)一、定义
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
二、优缺点
优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点: 1、使用命令模式可能会导致某些系统有过多的具体命令类。
三、具体实现3.1 原型图
- Command:声明执行操作的接口。
- ConcreteCommand:将一个接收者对象绑定于一个动作。调用接收者相应的操作,以实现Execute。
- Client:创建一个具体命令对象并设定它的接受者。
- Invoker:要求该命令执行这个请求。
- Receiver:知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接受者。
3.2 实现
1、创建一个命令接口 Command。
/** * @author zhongtao * @date 2023/5/28 14:44 */public interface Order { void execute();}
2、创建一个请求类 Client。
/** * @author zhongtao * @date 2023/5/28 14:44 */public class Stock { private String name = "商品ABC"; private int quantity = 10; public void buy() { System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ]bought "); } public void sell() { System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ]sold "); }}
3、创建实现了Order接口的实体类 ConcreteCommand。
/** * @author zhongtao * @date 2023/5/28 14:45 */public class BuyStock implements Order { private Stock abcStock; public BuyStock(Stock abcStock) { this.abcStock = abcStock; } @Override public void execute() { abcStock.buy(); }}/** * @author zhongtao * @date 2023/5/28 14:46 */public class SellStock implements Order { private Stock abcStock; public SellStock(Stock abcStock) { this.abcStock = abcStock; } @Override public void execute() { abcStock.sell(); }}
4、创建命令调用类 Receiver。
import java.util.ArrayList;import java.util.List;/** * @author zhongtao * @date 2023/5/28 14:46 */public class Broker { private List orderList = new ArrayList(); public void takeOrder(Order order) { orderList.add(order); } public void placeOrders() { for (Order order : orderList) { order.execute(); } orderList.clear(); }}
5、使用 Broker 类来接受并执行命令。
/** * @author zhongtao * @date 2023/5/28 14:47 */public class CommandPatternDemo { public static void main(String[] args) { Stock abcStock = new Stock(); BuyStock buyStockOrder = new BuyStock(abcStock); SellStock sellStockOrder = new SellStock(abcStock); Broker broker = new Broker(); broker.takeOrder(buyStockOrder); broker.takeOrder(sellStockOrder); broker.placeOrders(); }}
6、执行程序,输出结果:
Stock [ Name: 商品ABC, Quantity:10 ]bought Stock [ Name: 商品ABC, Quantity:10 ]sold