说明
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,以便在不同的请求者和接收者之间进行解耦、参数化和操作的队列化。命令模式允许你将具体的请求封装为对象,这些对象之间彼此独立,并且可以用不同的请求对客户端进行参数化。
结构
- 命令接口(Command):声明执行命令的方法。
- 具体命令类(Concrete Command):实现命令接口,负责执行具体的操作。
- 接收者类(Receiver):包含了具体的操作方法,由具体命令类调用。
- 请求者类(Invoker):持有命令对象,并在需要时调用命令的执行方法。
工作原理
- 创建命令接口,并声明执行命令的方法,如
execute()
。 - 创建具体命令类,实现命令接口,并在
execute()
方法中调用接收者类的具体操作方法。 - 创建接收者类,包含了具体的操作方法。
- 创建请求者类,持有命令对象,在需要时调用命令的
execute()
方法。
优点
- 解耦请求者和接收者:命令模式将请求者和接收者之间解耦,使得它们可以独立变化,互不影响。
- 可扩展性:可以轻松添加新的命令类和接收者类,而不会影响已有的代码。
- 可撤销操作:可以通过维护一个命令历史栈,实现对命令的撤销和重做。
缺点
- 增加了类和对象的数量:引入命令对象和接收者类,会增加系统中的类和对象的数量。
- 代码结构复杂化:使用命令模式需要定义许多新的类和接口,因此会增加代码结构的复杂性。
使用场景
- 需要将请求者和接收者解耦,以便能够在不同的请求者和接收者之间进行灵活的变动和组合。
- 需要支持撤销操作。
- 需要将一系列的操作队列化,即可以将命令对象存储在列表中,并按顺序执行。
示例
下面以一个简单的股票交易系统为例,介绍命令模式的应用。
假设我们有一个股票交易系统,我们希望实现以下功能:
- 可以买入股票(BuyStock命令)。
- 可以卖出股票(SellStock命令)。
- 可以撤销上一次的交易操作(Undo命令)。
首先,我们定义命令接口Command
,声明了一个execute()
方法:
public interface Command {
void execute();
}
然后,我们创建具体的买入股票命令BuyStockCommand
,实现了Command
接口:
public class BuyStockCommand implements Command {
private StockTrade stockTrade;
public BuyStockCommand(StockTrade stockTrade) {
this.stockTrade = stockTrade;
}
public void execute() {
stockTrade.buy();
}
}
再创建具体的卖出股票命令SellStockCommand
,同样实现了Command
接口:
public class SellStockCommand implements Command {
private StockTrade stockTrade;
public SellStockCommand(StockTrade stockTrade) {
this.stockTrade = stockTrade;
}
public void execute() {
stockTrade.sell();
}
}
接下来,我们创建股票交易类StockTrade
,它包含了具体的买入和卖出操作:
public class StockTrade {
public void buy() {
System.out.println("买入股票");
}
public void sell() {
System.out.println("卖出股票");
}
}
最后,我们创建请求者类StockBroker
,它持有命令对象,并在需要时调用命令的execute()
方法:
public class StockBroker {
private Command buyStockCommand;
private Command sellStockCommand;
private Command undoCommand;
public StockBroker(Command buyStockCommand, Command sellStockCommand, Command undoCommand) {
this.buyStockCommand = buyStockCommand;
this.sellStockCommand = sellStockCommand;
this.undoCommand = undoCommand;
}
public void buyStock() {
buyStockCommand.execute();
}
public void sellStock() {
sellStockCommand.execute();
}
public void undo() {
undoCommand.execute();
}
}
现在,我们可以创建股票交易系统的实例,并进行操作:
public class CommandExample {
public static void main(String[] args) {
// 创建股票交易对象
StockTrade stockTrade = new StockTrade();
// 创建具体的命令对象
Command buyStockCommand = new BuyStockCommand(stockTrade);
Command sellStockCommand = new SellStockCommand(stockTrade);
// 创建请求者对象
StockBroker stockBroker = new StockBroker(buyStockCommand, sellStockCommand, buyStockCommand);
// 执行买入操作
stockBroker.buyStock(); // 买入股票
// 执行卖出操作
stockBroker.sellStock(); // 卖出股票
// 撤销操作
stockBroker.undo(); // 买入股票
}
}
运行结果如下:文章来源:https://www.toymoban.com/news/detail-618679.html
买入股票
卖出股票
买入股票文章来源地址https://www.toymoban.com/news/detail-618679.html
到了这里,关于【设计模式|行为型】命令模式(Command Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!