设计模式-命令模式
# 设计模式-命令模式
# 概述
生活中我们控制电器并非直接去控制电线,而是通过遥控器去控制。而当我们把遥控器和电器解耦,控制器只是控制开关,电器控制电器开关。控制器和电器通过电线来链接。通过不同的电器链接,我们就可以实用遥控器去控制不同的电器。
# 定义
命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
命令模式: 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
# 命令模式结构
命令模式包括如下角色:
- 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
- 具体命令角色(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
- 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
- 调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
# 命令模式应用案例
1、创建一个命令接口
public interface Order {
void execute();
}
2、创建请求类
public class Stock {
private final String name = "ABC";
private final 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、创建命令实体类
public class BuyStock implements Order{
private final Stock abcStock;
public BuyStock(Stock abcStock) {
this.abcStock = abcStock;
}
public void execute() {
abcStock.buy();
}
}
public class SellStock implements Order {
private final Stock abcStock;
public SellStock(Stock abcStock){
this.abcStock = abcStock;
}
public void execute() {
abcStock.sell();
}
}
4、创建命令调用类
public class Broker {
private final List<Order> orderList = new ArrayList<Order>();
public void takeOrder(Order order){
orderList.add(order);
}
public void placeOrders(){
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
5、案例实现
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();
}
}
// 输出
Stock [ Name: ABC, Quantity:10 ]bought
Stock [ Name: ABC, Quantity:10 ]sold
# 命令模式优缺点
优点:
- 降低系统的耦合度
- 新的命令可以很容易地加入到系统中。
- 可以比较容易地设计一个命令队列或宏命令
- 为请求的撤销和恢复操作提供了一种设计和实现方案。
缺点:
适用命令模式可能会导致某些系统有过多的具体命令类
# 命令模式适用环境
- 系统需求将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
- 系统需要在不同的时间指定请求、将请求排队和执行请求。
- 系统需要支持命令的撤销操作和恢复操作。
- 系统需要将一组操作组合在一起形成宏命令。
# 参考
Java设计模式
上次更新: 2024/06/29, 15:13:44