命令模式(Command Pattern)
1.策略模式(Strategy Pattern)2.桥接模式(Bridge Pattern)3.代理模式(Proxy Pattern)4.中介者模式(Mediator Pattern)5.过滤器模式(Filter Pattern)6.适配器模式(Adapter Pattern)7.责任链模式(Chain Of Responsibility Pattern)8.装饰器模式(Decorator Pattern)9.建造者模式(Builder Pattern)10.观察者模式(Observer Pattern)11.工厂模式(Factory Pattern)12.单例模式(Singleton Pattern)13.组合模式(Composite Pattern)14.模板模式(Template Pattern)15.原型模式(Prototype Pattern)16.外观模式(Facade Pattern)17.享元模式(Flyweight Pattern)
18.命令模式(Command Pattern)
19.解释器模式(Interpreter Pattern)20.迭代器模式(Iterator Pattern)命令模式(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<Order> 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律