代码:
package com.zhangxf.command;
import java.util.ArrayList;
import java.util.List;
// 股票
class Stock {
// 股票名称
private String name;
public Stock(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 股票操作类
class StockOp {
// 操作关联账号名称
private String account;
// 操作关联股票
private Stock stock;
// 操作股票数量
private int quantity;
public StockOp(String account, Stock stock, int quantity) {
this.account = account;
this.stock = stock;
this.quantity = quantity;
}
// 买股票
public void buy() {
System.out.println(account + " buy " + quantity + " " + stock.getName() + " ");
}
// 卖股票
public void sell() {
System.out.println(account + " sell " + quantity + " " + stock.getName() + " ");
}
}
// 命令接口
interface Order {
public void excecute();
}
// 买
class Buy implements Order {
private StockOp op;
public Buy(StockOp op) {
this.op = op;
}
@Override
public void excecute() {
op.buy();
}
}
// 卖
class Sell implements Order {
private StockOp op;
public Sell(StockOp op) {
this.op = op;
}
@Override
public void excecute() {
op.sell();
}
}
// 股票交易代理
class Broker {
private List<Order> orderList;
public Broker() {
orderList = new ArrayList<Order>();
}
public void addTradePlan(Order order) {
orderList.add(order);
}
public void showTradePlan() {
System.out.println("opList:" + orderList.size());
}
public void excecuteTradePlan() {
for(Order order: orderList) {
order.excecute();
}
}
public void clearTradePlan() {
orderList.clear();
}
}
public class Command {
public static void main(String[] args) {
// 创建股票
Stock a = new Stock("STOCK A");
Stock b = new Stock("STOCK B");
Stock c = new Stock("STOCK C");
// 创建股票操作类实例
StockOp aOp = new StockOp("Billy", a, 100);
StockOp bOp = new StockOp("Kate", b, 50);
StockOp cOp = new StockOp("Jason", c, 200);
// 创建股票交易代理
Broker broker = new Broker();
broker.addTradePlan(new Buy(aOp));
broker.addTradePlan(new Buy(bOp));
broker.addTradePlan(new Sell(cOp));
// 显示交易计划
broker.showTradePlan();
// 执行交易计划
broker.excecuteTradePlan();
// 再次执行交易计划
broker.excecuteTradePlan();
// 清空交易计划
broker.clearTradePlan();
}
}
实现要点:
- 股票类只记录了服务的属性
- 股票操作类关联了具体的股票、可以对股票执行的全部操作、以及需要的具体参数
- 命令接口的实现类内部包含一个股票操作类,明确到底对关联股票执行何种操作。
- 代理类管理、存储全部命令接口的实例。
命令模式将多个单独的命令集中记录在一起,能够集中审计、执行、重复执行、回退等,有点像脚本中的批量执行。