包头网站建设奥北,电脑设计图制作软件app,做网站是前端还是后端,企业英文网站制作文章目录 引言命令模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用股票示例代码地址 引言
想象一下#xff0c;你在一个忙碌的厨房里#xff0c;厨师们正忙于准备各种菜肴。每当服务员带来一个新订单时#xff0c;他们不会直接对厨师说需要做什么菜。相… 文章目录 引言命令模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用股票示例代码地址 引言
想象一下你在一个忙碌的厨房里厨师们正忙于准备各种菜肴。每当服务员带来一个新订单时他们不会直接对厨师说需要做什么菜。相反订单被写在纸上并放置在一个订单队列中。厨师们会一个接一个地取订单并准备相应的菜肴。这里每个订单就像是一个“命令”它包含了需要执行的所有信息。在软件开发中我们处理命令时也可以采取类似的方式。命令模式允许我们以同样的方式封装所有信息这些信息需要执行某项操作或触发某个事件然后像传递订单一样传递这些命令。
命令模式简介
定义与用途
命令模式Command Pattern是一种行为型设计模式它将一个请求或简单操作封装为一个对象。这种模式允许用户根据不同的请求将方法调用、请求或操作封装到单独的对象中并将这些对象传递给调用者。调用者随后可以根据需求执行这些操作。这种模式通常用于队列操作、回调操作和对请求的日志记录。
实现方式
实现命令模式涉及以下几个关键组件
命令接口Command定义了执行操作的接口。具体命令Concrete Command实现命令接口定义接收者上执行的动作。接收者Receiver执行与请求相关联的操作。调用者Invoker持有命令并在某个时间点调用命令的执行方法。客户端Client创建具体命令并设置其接收者。
使用场景
命令模式适用于以下场景 当需要将请求发送者和请求接收者解耦时。 当需要对请求的排队、记录或可撤销操作时。 在需要支持宏命令和事务系统的场景中。
例如
GUI按钮和菜单项GUI的按钮和菜单项通常使用命令模式来处理用户输入。事务型行为命令模式可以用来实现事务系统其中命令有执行和回滚两种操作。多级撤销功能在支持撤销操作的系统中命令模式可以用来记录操作的历史以便用户可以撤销或重做它们。
优势与劣势
优势 降低系统的耦合度命令模式将调用操作的对象与知道如何实施该操作的对象解耦。 增强了扩展性可以很容易地增加新的命令。 可以组合命令可以组合多个命令实现复杂的功能。劣势 可能会导致某些系统有过多的具体命令类。
在Spring框架中的应用
JdbcTemplate 是Spring框架中使用命令模式的一个很好的例子。在JdbcTemplate的上下文中命令模式提供了一种强大的机制来抽象和封装对数据库的各种操作。它允许JdbcTemplate通过执行各种StatementCallback实现来灵活地执行各种操作同时保持其自身的简洁和不涉及具体数据库操作的逻辑。
1命令接口Command- StatementCallback
StatementCallbackT接口 在这个上下文中类似于命令模式中的命令接口。它定义了一个doInStatement(Statement stmt)方法该方法接收一个Statement对象作为参数。不同的实现将对数据库执行不同的操作。
2具体命令和接收者 - QueryStatementCallBack和其他实现
具体命令 由实现StatementCallback接口的类表示例如QueryStatementCallBack。这些类封装了对数据库执行特定操作的逻辑。
同时充当命令接收者在这种情况下具体命令类例如QueryStatementCallBack不仅表示命令还包含执行命令所需的逻辑因此它们也扮演了接收者的角色。它们知道如何操作数据库来执行特定的操作。
3命令调用者 - JdbcTemplate
JdbcTemplate 是命令调用者。它提供了一个execute方法该方法接受一个StatementCallback对象。JdbcTemplate不关心StatementCallback的具体操作它只调用doInStatement方法并传递必要的Statement对象。这样JdbcTemplate就可以执行各种不同的数据库操作而不需要知道具体的细节。
4不同的具体命令实现
StatementCallback的其他实现如QueryStatementCallback为不同类型的数据库操作提供了具体实现。每个实现都有自己独特的doInStatement方法它们封装了如何使用传递给它们的Statement来执行操作。股票示例 步骤 1创建命令接口 首先定义了一个 Order 接口作为命令的角色。
public interface Order {void execute();
}这个接口定义了一个execute方法所有的命令都将实现这个方法来执行它们的操作。
步骤 2创建请求类 创建了一个 Stock 类作为请求的角色。
public class Stock {private String name ABC;private int quantity 10;public void buy(){System.out.println(股票 [ 名称: name, 数量: quantity ] 购买了);}public void sell(){System.out.println(股票 [ 名称: name, 数量: quantity ] 卖出了);}
}这个类代表一个股票有买入和卖出的操作。
步骤 3创建具体命令类 创建了实现Order接口的具体命令类。
public class BuyStock implements Order {private Stock abcStock;public BuyStock(Stock abcStock){this.abcStock abcStock;}Overridepublic void execute() {abcStock.buy();}
}public class SellStock implements Order {private Stock abcStock;public SellStock(Stock abcStock){this.abcStock abcStock;}Overridepublic void execute() {abcStock.sell();}
}BuyStock和SellStock是具体的命令分别代表购买股票和出售股票的操作。
步骤 4创建命令调用者类 创建了一个 Broker 类作为命令的调用者。
import java.util.ArrayList;
import java.util.List;public class Broker {private ListOrder orderList new ArrayListOrder(); public void takeOrder(Order order){orderList.add(order); }public void placeOrders(){for (Order order : orderList) {order.execute();}orderList.clear();}
}Broker 可以接受和存储命令然后一次性执行这些命令。它通过调用每个命令的execute方法来执行命令。
步骤 5使用 Broker 类来接受和执行命令
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();}
} 在这个客户端中我们创建了买入和卖出股票的命令然后通过Broker来执行它们。这个例子演示了命令模式如何用于参数化对象以及如何将请求排队等待执行。
代码地址
23种设计模式相关代码后续会逐步提交到github上方便学习欢迎指点 代码地址 https://github.com/RuofeiSun/lf-23Pattern