《JAVA与模式》之命令模式

Java设计模式命令模式(Command Pattern) 命令模式通过将操作封装为对象,实现了请求发送者接收者的解耦,适用于需要支持撤销、事务、批量操作等复杂场景。,它将请求封装为独立的对象,使得不同请求的调用、队列化、日志记录或撤销操作成为可能。该模式通过解耦请求的发送者接收者,增强系统的灵活性和扩展性。:将请求转换为包含所有请求信息的独立对象(命令),支持参数化、延迟执行、撤销/重做等功能。:按钮点击事件绑定命令对象,支持撤销(如Photoshop的“撤销上一步”)。:数据库事务的提交回滚可视为命令模式的应用。支持命令的队列、日志、撤销/重做。 阅读详情

系列文章目录



前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述
在阎宏博士的《JAVA与模式》一书中开头是这样描述命令(Command)模式的:

命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。

命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。


一、命令模式的结构

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:

(1)命令模式使新的命令很容易地被加入到系统里。

(2)允许接收请求的一方决定是否要否决请求。

(3)能较容易地设计一个命令队列。

(4)可以容易地实现对请求的撤销和恢复。

(5)在需要的情况下,可以较容易地将命令记入日志。

下面以一个示意性的系统,说明命令模式的结构。
在这里插入图片描述
命令模式涉及到五个角色,它们分别是:

●  客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。

●  命令(Command)角色:声明了一个给所有具体命令类的抽象接口。

●  具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。

●  请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。

●  接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

源代码
  接收者角色类

复制代码
public class Receiver {
/**
* 真正执行命令相应的操作
*/
public void action(){
System.out.println(“执行操作”);
}
}
复制代码
  抽象命令角色类

复制代码
public interface Command {
/**
* 执行方法
*/
void execute();
}
复制代码
  具体命令角色类

复制代码
public class ConcreteCommand implements Command {
//持有相应的接收者对象
private Receiver receiver = null;
/**
* 构造方法
*/
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
//通常会转调接收者对象的相应方法,让接收者来真正执行功能
receiver.action();
}

}
复制代码
  请求者角色类

复制代码
public class Invoker {
/**
* 持有命令对象
/
private Command command = null;
/
*
* 构造方法
/
public Invoker(Command command){
this.command = command;
}
/
*
* 行动方法
*/
public void action(){

    command.execute();
}

}
复制代码
  客户端角色类

复制代码
public class Client {

public static void main(String[] args) {
    //创建接收者
    Receiver receiver = new Receiver();
    //创建命令对象,设定它的接收者
    Command command = new ConcreteCommand(receiver);
    //创建请求者,把命令对象设置进去
    Invoker invoker = new Invoker(command);
    //执行方法
    invoker.action();
}

}

二、AudioPlayer系统

小女孩茱丽(Julia)有一个盒式录音机,此录音机有播音(Play)、倒带(Rewind)和停止(Stop)功能,录音机的键盘便是请求者(Invoker)角色;茱丽(Julia)是客户端角色,而录音机便是接收者角色。Command类扮演抽象命令角色,而PlayCommand、StopCommand和RewindCommand便是具体命令类。茱丽(Julia)不需要知道播音(play)、倒带(rewind)和停止(stop)功能是怎么具体执行的,这些命令执行的细节全都由键盘(Keypad)具体实施。茱丽(Julia)只需要在键盘上按下相应的键便可以了。

录音机是典型的命令模式。录音机按键把客户端与录音机的操作细节分割开来。

在这里插入图片描述
源代码
  接收者角色,由录音机类扮演

复制代码
public class AudioPlayer {

public void play(){
    System.out.println("播放...");
}

public void rewind(){
    System.out.println("倒带...");
}

public void stop(){
    System.out.println("停止...");
}

}
复制代码
  抽象命令角色类

复制代码
public interface Command {
/**
* 执行方法
*/
public void execute();
}
复制代码
  具体命令角色类

复制代码
public class PlayCommand implements Command {

private AudioPlayer myAudio;

public PlayCommand(AudioPlayer audioPlayer){
    myAudio = audioPlayer;
}
/**
 * 执行方法
 */
@Override
public void execute() {
    myAudio.play();
}

}
复制代码
复制代码
public class RewindCommand implements Command {

private AudioPlayer myAudio;

public RewindCommand(AudioPlayer audioPlayer){
    myAudio = audioPlayer;
}
@Override
public void execute() {
    myAudio.rewind();
}

}
复制代码
复制代码
public class StopCommand implements Command {
private AudioPlayer myAudio;

public StopCommand(AudioPlayer audioPlayer){
    myAudio = audioPlayer;
}
@Override
public void execute() {
    myAudio.stop();
}

}
复制代码
  请求者角色,由键盘类扮演

复制代码
public class Keypad {
private Command playCommand;
private Command rewindCommand;
private Command stopCommand;

public void setPlayCommand(Command playCommand) {
    this.playCommand = playCommand;
}
public void setRewindCommand(Command rewindCommand) {
    this.rewindCommand = rewindCommand;
}
public void setStopCommand(Command stopCommand) {
    this.stopCommand = stopCommand;
}
/**
 * 执行播放方法
 */
public void play(){
    playCommand.execute();
}
/**
 * 执行倒带方法
 */
public void rewind(){
    rewindCommand.execute();
}
/**
 * 执行播放方法
 */
public void stop(){
    stopCommand.execute();
}

}
复制代码
  客户端角色,由茱丽小女孩扮演

复制代码
public class Julia {
public static void main(String[]args){
//创建接收者对象
AudioPlayer audioPlayer = new AudioPlayer();
//创建命令对象
Command playCommand = new PlayCommand(audioPlayer);
Command rewindCommand = new RewindCommand(audioPlayer);
Command stopCommand = new StopCommand(audioPlayer);
//创建请求者对象
Keypad keypad = new Keypad();
keypad.setPlayCommand(playCommand);
keypad.setRewindCommand(rewindCommand);
keypad.setStopCommand(stopCommand);
//测试
keypad.play();
keypad.rewind();
keypad.stop();
keypad.play();
keypad.stop();
}
}
在这里插入图片描述

三、宏命令

所谓宏命令简单点说就是包含多个命令的命令,是一个命令的组合。

设想茱丽的录音机有一个记录功能,可以把一个一个的命令记录下来,再在任何需要的时候重新把这些记录下来的命令一次性执行,这就是所谓的宏命令集功能。因此,茱丽的录音机系统现在有四个键,分别为播音、倒带、停止和宏命令功能。此时系统的设计与前面的设计相比有所增强,主要体现在Julia类现在有了一个新方法,用以操作宏命令键。
  在这里插入图片描述
源代码
  系统需要一个代表宏命令的接口,以定义出具体宏命令所需要的接口。

复制代码
public interface MacroCommand extends Command {
/**
* 宏命令聚集的管理方法
* 可以添加一个成员命令
/
public void add(Command cmd);
/
*
* 宏命令聚集的管理方法
* 可以删除一个成员命令
*/
public void remove(Command cmd);
}
复制代码
  具体的宏命令MacroAudioCommand类负责把个别的命令合成宏命令。

复制代码
public class MacroAudioCommand implements MacroCommand {

private List<Command> commandList = new ArrayList<Command>();
/**
 * 宏命令聚集管理方法
 */
@Override
public void add(Command cmd) {
    commandList.add(cmd);
}
/**
 * 宏命令聚集管理方法
 */
@Override
public void remove(Command cmd) {
    commandList.remove(cmd);
}
/**
 * 执行方法
 */
@Override
public void execute() {
    for(Command cmd : commandList){
        cmd.execute();
    }
}

}
复制代码
  客户端类Julia

复制代码
public class Julia {

public static void main(String[]args){
    //创建接收者对象
    AudioPlayer audioPlayer = new AudioPlayer();
    //创建命令对象
    Command playCommand = new PlayCommand(audioPlayer);
    Command rewindCommand = new RewindCommand(audioPlayer);
    Command stopCommand = new StopCommand(audioPlayer);
    
    MacroCommand marco = new MacroAudioCommand();
    
    marco.add(playCommand);
    marco.add(rewindCommand);
    marco.add(stopCommand);
    marco.execute();
}

}
在这里插入图片描述

四、命令模式的优点

●  更松散的耦合

命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。

●  更动态的控制

命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。

●  很自然的复合命令

命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。

●  更好的扩展性

由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。

Java设计模式Java设计模式之(六)命令模式(Command Pattern) 本文目录 一、命令模式介绍 二、代码实现 2.1 通用类图 2.2 代码实现 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 一、命令模式介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤 阅读详情

相关推荐

AWS DevOps Agent 完全指南

AI 驱动的 SRE 队友,7×24 自主调查告警、定位根因、生成修复方案、预防未来故障。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 327

16-Java命令模式 ( Command Pattern )

1. 意图将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化2. 主要解决在软件系统中,行为请求者行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适3. 何时使用在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者””行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合4. 如何解决。

深入Java世界:探索编程之美与技术深度 1565

5G/NR SSB学习总结

6.1 SSB概念 同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB),它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH三部分共同组成。 6.2 SSB特征 ...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 8万+

JAVA设计模式命令模式【Command Pattern】

一、概述     命令模式可以将请求发送者和接收者完全解耦,发送者接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法,命令模式是一种对象行为型模式。 二、使用场景 1>、系统要求请求发送者和接收者的解耦

小吕丶Code阶区 2586

Java 设计模式-命令模式(Command Pattern)

命令模式(Command Pattern)是对象的行为模式,其意图是将请求封装在对象的内部。 命令模式涉及的角色有: 客户端(Client )角色:负责创建一个具体的命令,并指定命令的接受者 命令(Command)角色:定义一个命令公共的操作接口 具体命令(Concrete Command)角色:定义一个命令的接收者和行为之间的耦合。实现命令接口的公共接口,调用接......

技术分享 256

Java设计模式 Design Pattern:命令模式 Command Pattern

Java设计模式 Design Pattern:命令模式 Command Pattern 目的 Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support un...

ahch8077的博客 154

Java设计模式之《命令模式

命令模式是一种行为设计模式,它将请求封装成独立对象,实现请求发出者执行者的解耦。该模式包含命令接口、具体命令、接收者、调用者和客户端五个角色。典型应用场景包括任务调度、数据库操作和餐厅点餐等。优点在于解耦彻底、支持撤销/队列功能,但会增加类的数量。通过将"执行动作"封装为命令对象,使系统更灵活,但需权衡复杂度。

weixin_50055999的博客 1469

Java设计模式 十七 命令模式 (Command Pattern)

命令模式通过将请求封装成对象,解耦了请求的发送者和接收者,提供了灵活的执行、撤销和组合命令的能力。它在需要解耦请求和执行的场景中非常有用,尤其适用于GUI系统、任务调度、宏命令等应用场景。虽然命令模式可能增加系统的复杂度,但它在结构上更具可扩展性和灵活性,非常适合处理复杂的操作逻辑。

743

java——命令模式(Command pattern)

8.命令模式(Command pattern)

超人迪X 133

JAVA命令模式(Command Pattern)的技术指南

命令模式是一种行为型设计模式,它将请求封装为独立对象,使请求的发送者和接收者解耦。该模式支持参数化、队列化操作,并可以轻松实现撤销/重做功能。通过命令接口、具体命令、接收者和调用者等角色,命令模式能够将操作封装为对象,使系统更灵活可扩展。典型的应用场景包括GUI按钮操作、文本编辑器撤销功能和智能家居设备控制等。虽然会增加类的数量,但命令模式能有效降低系统耦合度,是设计灵活可扩展系统的重要工具。

木头 585

Java设计模式(十五)行为型- 命令模式Command Pattern(史上最全命令模式使用场景以及优缺点

命令模式

移动端开发与最新技术 474

Java设计模式——命令模式【Command Pattern】

Java设计模式命令模式、Command Pattern

scorpio的博客 1020

Java命令模式(Command Pattern)

Java命令模式(Command Pattern)

Sup_Heaven的专栏 1101

Java特性之设计模式命令模式

定义了执行操作的接口,通常包含一个execute方法,用于调用具体的操作。

Vinjcent 1259

java设计模式--命令模式(Command Pattern)

Java命令模式(Command Pattern) 1.概念   将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化不变的因素。    在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。 但在有些情况...

白开水的世界 209

java设计模式命令模式

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 一、首先了解一下java的23种设计模式,总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外...

孤云博客 3541

Java 设计模式】行为型之命令模式

命令模式是一种行为型设计模式,用于将请求封装为对象,使得可以参数化客户端对象,并且能够排队、记录请求,以及支持撤销操作。命令模式的核心思想是将请求发送者和接收者解耦,通过命令对象来封装请求。命令对象包含了执行请求的方法,通过这种方式实现了请求的发起和执行的解耦。命令模式通常包含四个主要角色:命令(Command)、具体命令(Concrete Command)、命令发送者(Invoker)、命令接收者(Receiver)。声明了执行请求的接口实现了命令接口,对具体的请求进行了封装。

好久不见的流星 2022

java命令模式应用_Java命令模式(Command Pattern)

三、举例本来想接着我的JUnit分析来讲解命令模式。但是由于在JUnit中,参杂了其它的模式在里面,使得命令模式的特点不太明显。所以这里将以命令模式在Web开发中最常见的应用——Struts中Action的使用作为例子。在Struts中Action控制类是整个框架的核心,它连接着页面请求和后台业务逻辑处理。按照框架设计,每一个继承自Action的子类,都实现execute方法——调用后台真正处理业...

weixin_39670849的博客 177

Java设计模式 —— 【行为型模式命令模式(Command Pattern) 详解

命令模式是一个行为模式,它是将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加管理。

知唔猪的博客 1441

Java设计模式】11命令模式

命令模式(Command)是指,把请求封装成一个命令,然后执行该命令。

weixin_44943389的博客 120

长虹智能电视强制刷机升级固件 ZLM60HiS机芯 Q1FU、D6000i、U3、D8000iD 升级软件:V1.00014

软件强制升级方法:1、下载后解压,找到upgrade_ZLM60HiS_MT5508_V1.00xxx_part.pkg 、chandroid_ota_ZLM60HiS_datapart.zip复制到U盘根目录(不要有任何文件夹),将U盘插入USB1或USB2口,待机状态下开机,系统自动进入升级过程,在升级过程中,不要掉电;升级完成后,自动开机。2、等完全正常后拨下U盘,否即开机又升。3、启动升级,就要等5-30分钟,中途不能有任何断电。不能升的按住待机键或其它按键,遥控开机试升级维修模式进入方法使用用户遥控器,按【菜单】键后,当焦点移至“情景模式”下的“标准模式”菜单上时,按【上、右、右】组合键,弹出数字软键盘,当输入0816进入工厂菜单;

上一篇: 《JAVA与模式》之备忘录模式
下一篇: 《JAVA与模式》之责任链模式
Java毕设王
博客等级 码龄7年 9146粉丝 · 942原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java毕设王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值