Java Command Pattern(命令行模式)

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

优点: 1、降低了系统耦合度。 2、新的命令可以很容易添加到系统中去。
缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

  1. 创建一个命令接口。
/**
 * 1. 创建一个命令接口。
 * @author mazaiting
 */
public interface Order {
    /**
     * 执行
     */
    void execute();
}
  1. 创建一个请求类。
/**
 * 2. 创建一个请求类。
 * @author mazaiting
 */
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");
    }
    
}
  1. 创建实现了 Order 接口的实体类。
/**
 * 3. 创建实现了 Order 接口的实体类。
 * @author mazaiting
 */
public class BuyStock implements Order{

    private Stock abcStock;
    
    public BuyStock(Stock abcStock){
        this.abcStock = abcStock;
    }
    
    public void execute() {
        abcStock.buy();
    }

}

/**
 * 3. 创建实现了 Order 接口的实体类。
 * @author mazaiting
 */
public class SellStock implements Order{

    private Stock abcStock;
    
    public SellStock(Stock abcStock){
        this.abcStock = abcStock;
    }
    
    public void execute() {
        abcStock.sell();
    }

}
  1. 创建命令调用类。
/**
 * 4. 创建命令调用类。
 * @author mazaiting
 */
public class Broker {
    private List<Order> orderList = new ArrayList<Order>();
    
    /**
     * 添加命令
     */
    public void takeOrder(Order order) {
        orderList.add(order);
    }
    
    /**
     * 执行并清空命令
     */
    public void placeOrders(){
        for (Order order : orderList) {
            order.execute();
        }
        orderList.clear();
    }
}
  1. 使用 Broker 类来接受并执行命令。
/**
 * 5. 使用 Broker 类来接受并执行命令。
 * @author mazaiting
 */
public class Client {
    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();       
    }
}
  1. 打印结果
Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold
上一篇:Email-FTP-RTSP协议实践研究


下一篇:动态规划法(十)最长公共子序列(LCS)问题