命令模式
来源:互联网 发布:淘宝买家评价多久清空 编辑:程序博客网 时间:2024/06/06 01:16
命令模式
命令模式:讲一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录日志,以及支持可撤销的操作。是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
命令模式将行为请求者与行为实现者松耦合,下面是一个买卖股票的例子,由于本人对于命令模式这块理解不到位,所以请大家帮忙指点哈,菜鸟才开始学习,希望大家提供点帮助。
一系列请求的封装类,在接下来是Order的衍生类,可以理解为订单,
public interface Order {void execute();}
public class SellStock implements Order{private Stock stock;public void setStock(Stock stock) {//订单中含有最终的执行者实例,这个是why?订单记录者在记录时就知道这个订单由谁前去执行,直接在这里赋值,this.stock = stock;}@Overridepublic void execute() {stock.sell();}}
public class BuyStock implements Order{private Stock stock;public void setStock(Stock stock) {this.stock = stock;}@Overridepublic void execute() {stock.buy();}}
请求的最终执行类,在订单类中使用它,并且最终通过它来执行股票的购买和挂牌出售
public class Stock {private String name = "XXX Stock";private int quality = 10;public void buy() {System.out.println("buy stock "+name+",quality:"+quality);}public void sell() {System.out.println("sell stock "+name+",quality"+quality);}}
一个中间者,主要用来记录订单,并且通知执行者执行订单:
public class ExecutCommand {private List<Order> orders = new ArrayList<>();public void addOrer(Order order) {orders.add(order);}public void placeOrder() {for (Order order : orders) {order.execute();}orders.clear();}}
在实例中使用这个命令:
public static void main(String[] args) {ExecutCommand command = new ExecutCommand();//中间的传话筒,中间类Stock stock = new Stock();//接收者,命令的执行者BuyStock buyStock = new BuyStock();//命令,SellStock sellStock = new SellStock();//命令buyStock.setStock(stock);sellStock.setStock(stock);command.addOrer(buyStock);command.addOrer(sellStock);command.placeOrder();}
输出结果
buy stock XXX Stock,quality:10
sell stock XXX Stock,quality10
这就是一个简单的命令模式实现,虽然没有实现取消,添加的功能,但是这个取消添加是可能会有失败的情况存在的。包含三个部分,订单(命令),执行者(命令执行者),中间者(记录及通知执行)。订单是由中间者记录产生,然后分配给执行者,并通知执行者完成订单。
阅读全文
0 0
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- Java中的回车(\r)和换行(\n)
- 【01】vue.js — 简析入门
- Jmeter实现百分比业务比例
- 用Virtual User Generator 录制
- 京东面试题分析
- 命令模式
- JupyterNotebook配置
- 逆向入门--第一次的HelloWorld
- 字符串问题---字典树(前缀树)的实现
- 链表的增删改
- 解决myeclipse自带maven下载中央仓库插件报403错误的问题(8.6版本不报403)
- Python:reduce在python高级版本中没有的原因
- Vue用v-bind给标签属性赋值 src, href...
- Nginx 日志配置(一)