设计模式——命令模式(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;
    }
}

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
闻哥9 分钟前
23种设计模式深度解析:从原理到实战落地
java·jvm·spring boot·设计模式·面试
求知摆渡33 分钟前
Spring AI 多模型对话 Demo 实战:OpenAI/Ollama 一套接口、Redis 会话记忆、SSE 流式输出、AOP 日志打点
java·spring
资深web全栈开发2 小时前
设计模式之享元模式 (Flyweight Pattern)
设计模式·享元模式
hrhcode4 小时前
【Netty】三.ChannelPipeline与ChannelHandler责任链深度解析
java·后端·spring·springboot·netty
驴儿响叮当20107 小时前
设计模式之原型模式
设计模式·原型模式
MX_93597 小时前
@Import整合第三方框架原理
java·开发语言·后端·spring
MX_93598 小时前
Spring注解方式整合Mybatis
java·后端·spring·mybatis
弹简特8 小时前
【JavaEE08-后端部分】SpringMVC03-SpringMVC第二大核心处理请求之Cookie/Session和获取header
java·spring boot·spring·java-ee
利刃大大9 小时前
【SpringCloud】远程调用OpenFeign && 快速入手 && 参数传递 && 继承方式 && 抽取方式 && 远程部署
后端·spring·spring cloud·openfeign·远程调用
努力也学不会java10 小时前
【Spring Cloud】统一服务入口-Gateway
后端·算法·spring·spring cloud·gateway·服务发现