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

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
考虑考虑3 分钟前
Springboot3.4.x中的@Bean使用
spring boot·后端·spring
萧曵 丶3 小时前
Spring @TransactionalEventListener
java·数据库·spring·事务·transactional·异步
N_NAN_N4 小时前
类图+案例+代码详解:软件设计模式----原型模式
java·设计模式·原型模式
默默coding的程序猿4 小时前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
缘来是庄5 小时前
设计模式之组合模式
java·设计模式·组合模式
DKPT5 小时前
Java组合模式实现方式与测试方法
java·笔记·学习·设计模式·组合模式
鼠鼠我呀25 小时前
【设计模式09】组合模式
设计模式·组合模式
Kyrie_Li5 小时前
(十五)Spring Test
java·后端·spring
RainbowSea6 小时前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·spring
夜阑卧听风吹雨,铁马冰河入梦来7 小时前
Spring AI 阿里巴巴学习
人工智能·学习·spring