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

设计模式(14):命令模式

介绍

  • 将一个请求封装为一个对象,从而使我们可用不同的请求对象客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式,事务transaction模式。

命令模式角色

  • 抽象命令类(Command)
  • 具体命令类(ConcretCommand)
  • 调用者/请求者(Invoker)
    • 请求的发送者,它通过命令对象来执行请求。一个调用者并不需要再设计时确定其接收者,因为它只与抽象命令类之间存在关联。在程序运行时,将调用命令对象的execute()方法。间接调用接收者的相关方法。
  • 接收者(Receiver)
    • 接收者执行与请求相关的操作,具体实现对请求的业务处理;
    • 未抽象前,实际执行操作内存的对象。
  • 客户端(client)
    • 在客户端中需要创建调用者对象、具体命令类对象,在创建具体命令对象时指定对应的接收者。发送者和接收者之间没有直接关系,都通过命令对象间接调用。

开发中常见的场景

  • Struts2中,action的整个调用过程中就有命令模式;
  • 数据库事务机制的底层实现;
  • java中线程池中也有命令模式。

代码实现

  • 抽象命令类(Command)
/*** 抽象命令   接口*/
public interface Command {void excute();
}
  • 具体命令类(ConcretCommand)
/*** 具体命令* 		拥有真正命令执行者的引用*/
public class ConcreteCommand implements Command{private Receiver receiver;	public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}@Overridepublic void excute() {//真正的命令执行前或后,可以执行相应的处理//......receiver.action();}	
}
  • 调用者/请求者(Invoker)
/*** 命令的调用者|发起者*/
public class Invoke {private Command command;public Invoke(Command command) {this.command = command;}/*** 业务方法    用于调用命令类的方法*/public void call(){//真正的命令执行前或后,可以执行相应的处理//......command.excute();}
}
  • 接收者(Receiver)
/*** 真正命令执行者*/
public class Receiver {public void action(){System.out.println("ִ执行任务开始。。。。");}
}
  • 客户端(client)
public static void main(String[] args) {Command c=new ConcreteCommand(new Receiver());Invoke i=new Invoke(c);i.call();
}



更多设计模式学习:

          设计模式(1):介绍
          设计模式(2):单例模式
          设计模式(3):工厂模式
          设计模式(4):建造者模式
          设计模式(5):原型模式
          设计模式(6):桥接模式
          设计模式(7):装饰器模式
          设计模式(8):组合模式
          设计模式(9):外观模式
          设计模式(10):享元模式
          设计模式(11):适配器模式
          设计模式(12):代理模式
          设计模式(13):模板方法模式
          设计模式持续更新中…

http://www.lryc.cn/news/333119.html

相关文章:

  • 关于阿里云云数据库自动扩缩容和自动SQL优化的20道面试题
  • mkcert生成ssl证书+nginx部署局域网内的https服务访问问题
  • PTA C 1050 螺旋矩阵(思路与优化)
  • 神经网络分类和回归任务实战
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 4 篇:串
  • 深入浅出 -- 系统架构之分布式多形态的存储型集群
  • STL —— list
  • 申请SSL证书
  • 深入浅出 -- 系统架构之负载均衡Nginx环境搭建
  • notepad++绿色版添加右键菜单
  • 7 个 iMessage 恢复应用程序/软件可轻松恢复文本
  • DockerFile启动jar程序
  • 基于R、Python的Copula变量相关性分析及AI大模型应用
  • 鸿蒙组件学习_Tabs组件
  • 【LangChain学习之旅】—(19)BabyAGI:根据气候变化自动制定鲜花存储策略
  • thinkphp6入门(21)-- 如何删除图片、文件
  • 虚拟内存知识详解
  • 数据结构初阶:顺序表和链表
  • 在flutter中添加video_player【视频播放插件】
  • golang微服务框架特性分析及选型
  • 苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro
  • GPU的了解
  • 鸿蒙实战开发-如何使用Stage模型卡片
  • 蓝桥杯刷题 前缀和与差分-[2128]重新排序(C++)
  • STM32重要参考资料
  • [StartingPoint][Tier0]Preignition
  • 数据库系统概论(超详解!!!)第三节 关系数据库标准语言SQL(Ⅴ)
  • SpringBoot | Spring Boot“整合Redis“
  • SV学习笔记(四)
  • Midjourney艺术家分享|By Moebius