zoukankan      html  css  js  c++  java
  • 命令模式

    定义:通过将一系列的操作封装成一个命令对象,方便执行,同时也能够更好的让我们进行一些操作回滚,用来记录是否执行过该操作等问题。
    场景: 
    1、当一个应用程序调用者与多个目标对象之间存在调用关系时,并且目标对象之间的操作很类似的时候。
    2、例如当一个目标对象内部的方法调用太复杂,或者内部的方法需要协作才能完成对象的某个特点操作时。
    3、有时候调用者调用目标对象后,需要回调一些方法。
    角色:
    1.Invoke:调用者对象。
    Receiver:接收调用者请求执行操作的目标对象。
    ICommand:用于解耦目标对象与调用者之间的抽象命令对象。

    使用:首先创建作为命令的接口 Order,然后创建作为请求的 Stock 类(命令对象)。实体命令类(对应一些列操作) BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单。
    1.创建一个命令接口及命令接口的实体类。

    public interface Order {
       void execute();
    }
    public class BuyStock implements Order {
       private Stock abcStock;
    
       public BuyStock(Stock abcStock){
          this.abcStock = abcStock;
       }
    
       public void execute() {
          abcStock.buy();
       }
    }
    public class SellStock implements Order {
       private Stock abcStock;
    
       public SellStock(Stock abcStock){
          this.abcStock = abcStock;
       }
    
       public void execute() {
          abcStock.sell();
       }
    }
    View Code

    2.创建一个请求类。

    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");
       }
    }

    3.创建命令调用类

    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();
       }
    }
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    Docker 简单部署 ElasticSearch
    Anaconda更新失败简单解决[CondaHTTPError: HTTP 000 CONNECTION FAILED for url]
    TermKit的新一代Mac终端,在Ubuntu 11.04 轻松安装TermKit
    Linux下如何测试网速
    centos7安装yum
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    yum 安装指定版本Docker
    如何在 Apache Hive 中解析 Json 数组
    unzip解压失败( cannot find zipfile directory)
    Linux 定时任务crontab_014
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8320931.html
Copyright © 2011-2022 走看看