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

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
super_lzb13 小时前
mybatis拦截器ResultSetHandler详解
java·spring·mybatis·springboot
Overt0p13 小时前
抽奖系统(6)
java·spring boot·redis·设计模式·rabbitmq·状态模式
while(1){yan}13 小时前
拦截器(详解)
数据库·spring boot·spring·java-ee·拦截器
自在极意功。14 小时前
简单介绍SpringAOP
java·spring·aop思想
__万波__14 小时前
二十三种设计模式(二十三)--责任链模式
java·设计模式·责任链模式
梵得儿SHI14 小时前
(第七篇)Spring AI 核心技术攻坚:国内模型深度集成与国产化 AI 应用实战指南
java·人工智能·spring·springai框架·国产化it生态·主流大模型的集成方案·麒麟系统部署调优
qq_124987075314 小时前
基于Spring Boot的电影票网上购票系统的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·spring·毕业设计·计算机毕业设计
廋到被风吹走14 小时前
【Spring 】Spring Security深度解析:过滤器链、认证授权架构与现代集成方案
java·spring·架构
码农小卡拉14 小时前
Springboot “钩子”:@PostConstruct注解
java·spring boot·后端·spring·spring cloud
帅次14 小时前
系统设计方法论全解:原则、模型与用户体验核心要义
设计模式·流程图·软件工程·软件构建·需求分析·设计规范·规格说明书