设计模式——命令模式(Command Pattern)+ Spring相关源码

文章目录

  • 一、命令模式定义
  • 二、例子
    • [2.1 菜鸟教程例子](#2.1 菜鸟教程例子)
      • [2.1.1 定义命令类接口](#2.1.1 定义命令类接口)
      • [2.1.2 定义命令执行者](#2.1.2 定义命令执行者)
      • [2.1.3 被处理对象Stock。](#2.1.3 被处理对象Stock。)
      • [2.1.4 封装处理Stock的命令](#2.1.4 封装处理Stock的命令)
    • [2.2 JDK源码------Runnable](#2.2 JDK源码——Runnable)
      • [2.2.1 命令接口](#2.2.1 命令接口)
      • [2.2.2 命令处理者](#2.2.2 命令处理者)
      • [2.2.3 命令实现类](#2.2.3 命令实现类)
    • [2.3 SpringMVC------Controller](#2.3 SpringMVC——Controller)
      • [2.3.1 请求对象 handler](#2.3.1 请求对象 handler)
      • [2.3.2 请求执行者 HandlerAdapter](#2.3.2 请求执行者 HandlerAdapter)
  • 三、其他设计模式

一、命令模式定义

类型: 行为型模式
目的: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

二、例子

2.1 菜鸟教程例子

2.1.1 定义命令类接口

java 复制代码
public interface Order {
   void execute();
}

2.1.2 定义命令执行者

java 复制代码
import java.util.ArrayList;
import java.util.List;
 
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();
   }
}

2.1.3 被处理对象Stock。

菜鸟教程定义被处理的对象是Stock。

java 复制代码
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");
   }
}

2.1.4 封装处理Stock的命令

java 复制代码
public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.buy();
   }
}
java 复制代码
public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.sell();
   }
}

2.2 JDK源码------Runnable

虽然 Runnable 接口本身并不是一个命令模式的实现,但结合Thread和自定义的Runnable 实现类可以认为它运用了命令模式。

2.2.1 命令接口

java 复制代码
public interface Runnable {
    public abstract void run();
}

2.2.2 命令处理者

java 复制代码
public class Thread implements Runnable {
    private Runnable target;
    
    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
​
        group.add(this);
​
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }
    
    private native void start0();
}

2.2.3 命令实现类

java 复制代码
public class OrderThread {
    public void run(){
	   	 //todo
    }
}

2.3 SpringMVC------Controller

个人认为Controller也是运用了命令模式。

2.3.1 请求对象 handler

2.3.2 请求执行者 HandlerAdapter

HandlerAdapter光看名字就知道运用了适配模式,我们就看handle方法部分就好了。

java 复制代码
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    public SimpleControllerHandlerAdapter() {
    }

    public boolean supports(Object handler) {
        return handler instanceof Controller;
    }

    @Nullable
    public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return ((Controller)handler).handleRequest(request, response);
    }

    public long getLastModified(HttpServletRequest request, Object handler) {
        return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;
    }
}

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
Tatakai253 小时前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis
丶白泽4 小时前
重修设计模式-结构型-组合模式
设计模式·组合模式
掐指一算乀缺钱5 小时前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
yunhuibin5 小时前
ffmpeg面向对象——参数配置秘密探索及其设计模式
学习·设计模式·ffmpeg
bug菌¹5 小时前
滚雪球学SpringCloud[4.2讲]: Zuul:Netflix API Gateway详解
spring·spring cloud·gateway
小哇6666 小时前
spring-TransactionTemplate 编程式事务
数据库·spring
_祝你今天愉快6 小时前
技术成神之路:设计模式(十四)享元模式
java·设计模式
ChinaRainbowSea7 小时前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
小游鱼KF7 小时前
Spring学习前置知识
java·学习·spring
蔚一7 小时前
Java设计模式—面向对象设计原则(三) -----> 依赖倒转原则DIP(完整详解,附有代码+案例)
java·开发语言·设计模式·intellij-idea·依赖倒置原则