当前位置: 首页 > news >正文

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

文章目录

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

一、命令模式定义

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

二、例子

2.1 菜鸟教程例子

2.1.1 定义命令类接口

public interface Order {void execute();
}

2.1.2 定义命令执行者

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。

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的命令

public class BuyStock implements Order {private Stock abcStock;public BuyStock(Stock abcStock){this.abcStock = abcStock;}public void execute() {abcStock.buy();}
}
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 命令接口

public interface Runnable {public abstract void run();
}

2.2.2 命令处理者


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 命令实现类

public class OrderThread {public void run(){//todo}
}

2.3 SpringMVC——Controller

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

2.3.1 请求对象 handler

2.3.2 请求执行者 HandlerAdapter

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

public class SimpleControllerHandlerAdapter implements HandlerAdapter {public SimpleControllerHandlerAdapter() {}public boolean supports(Object handler) {return handler instanceof Controller;}@Nullablepublic 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;}
}

三、其他设计模式

创建型模式
结构型模式

  • 1、设计模式——装饰器模式(Decorator Pattern)+ Spring相关源码

行为型模式

  • 1、设计模式——访问者模式(Visitor Pattern)+ Spring相关源码
  • 2、设计模式——中介者模式(Mediator Pattern)+ JDK相关源码
  • 3、设计模式——策略模式(Strategy Pattern)+ Spring相关源码
  • 4、设计模式——状态模式(State Pattern)
  • 5、设计模式——观察者模式(Observer Pattern)+ Spring相关源码
  • 6、设计模式——备忘录模式(Memento Pattern)
  • 7、设计模式——模板方法模式(Template Pattern)+ Spring相关源码
  • 8、设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码
http://www.lryc.cn/news/218169.html

相关文章:

  • [开源]企业级在线办公系统,基于实时音视频完成在线视频会议功能
  • Scala语言用Selenium库写一个爬虫模版
  • ZZ038 物联网应用与服务赛题第I套
  • ClickHouse 学习之基础入门(一)
  • HttpClient基本使用
  • 力扣:150. 逆波兰表达式求值(Python3)
  • Tomcat运行日志乱码问题/项目用tomcat启动时窗口日志乱码
  • Leetcode—199.二叉树的右视图【中等】
  • 微信小程序如何跳转到外部小程序
  • ElasticSearch集群环境搭建
  • [架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库
  • delaunay和voronoi图 人脸三角剖分
  • MySQL数据库之表的增删查改
  • (论文阅读11/100)Fast R-CNN
  • Git 标签(Tag)实战:打标签和删除标签的步骤指南
  • React 底层 Fiber 架构 简单理解
  • 使用 Python 进行自然语言处理第 4 部分:文本表示
  • 【LLM】大语言模型高效微调方案Lora||直击底层逻辑
  • Qt for Android代码中输出日志
  • 力扣刷题-二叉树-二叉树的递归遍历
  • VX-3R APRS发射试验
  • JAVA毕业设计109—基于Java+Springboot+Vue的宿舍管理系统(源码+数据库)
  • CMU/MIT/清华/Umass提出生成式机器人智能体RoboGen
  • STM32:AHT20温湿度传感器驱动程序开发
  • 【Linux】第七站:vim的使用以及配置
  • 汇编-算术运算符
  • 线性代数 第六章 二次型
  • leetCode 213. 打家劫舍 II + 动态规划 + 从记忆化搜索到递推 + 空间优化
  • 网络编程套接字(二)
  • [极客大挑战 2019]Knife 1(两种解法)