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

三、其他设计模式

创建型模式
结构型模式

行为型模式

相关推荐
哪 吒5 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸6 小时前
01-spring security认证笔记
java·笔记·spring
没书读了7 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
转世成为计算机大神8 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术9 小时前
23种设计模式速记法
设计模式
代码小鑫10 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖10 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
小白不太白95010 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白95010 小时前
设计模式之 原型模式
设计模式·原型模式