一、我的理解
命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。(以上是菜鸟教程中对其的定义,目前我暂时还没有多深的体会)
二、实现方式
通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。
定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
三、实例
Java代码
Order接口: 命令接口,所有要执行的命令都需要实现这一接口
package com.study.dp.command;
/**
* 命令接口
* @author bird
*
*/
public interface Order {
void execute();
}
Stock类:请求类
package com.study.dp.command;
/**
* 请求类
* @author bird
*
*/
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");
}
}
BuyStock类:购买命令的实际执行类
package com.study.dp.command;
/**
* 实现order接口的实体类
* @author bird
*
*/
public class BuyStock implements Order {
private Stock abcStock;
public BuyStock(Stock abcStock) {
this.abcStock = abcStock;
}
@Override
public void execute() {
abcStock.buy();
}
}
SellStock类:销售命令的实际执行类
package com.study.dp.command;
/**
* 实现order接口的实体类
* @author bird
*
*/
public class SellStock implements Order {
private Stock abcStock;
public SellStock(Stock abcStock) {
this.abcStock = abcStock;
}
@Override
public void execute() {
abcStock.sell();
}
}
Broker类:调用对象,基于哪个请求则执行对应的类
package com.study.dp.command;
import java.util.ArrayList;
import java.util.List;
/**
* 命令调用类
* @author bird
*
*/
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();
}
}
Demo类:测试
package com.study.dp.command;
/**
* 测试类,使用Broker类来接受并执行命令
* @author bird
*
*/
public class Demo {
public static void main(String[] args) {
Stock abcStock = new Stock();
BuyStock buyStock = new BuyStock(abcStock);
SellStock sellStock = new SellStock(abcStock);
Broker broker = new Broker();
broker.takeOrder(buyStock);
broker.takeOrder(sellStock);
broker.placeOrders();
}
}
四、应用实例
1.GUI中的每一个按钮都是一个命令模式