命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而允许你使用不同的请求、队列或日志来参数化其他对象,同时支持请求的撤销与恢复。以下从多个方面详细介绍命令模式。

模式结构与角色

命令模式包含以下主要角色:

  1. 命令接口(Command):定义了执行操作的抽象方法,通常是 execute() 方法,具体命令类需要实现该接口。
  2. 具体命令类(Concrete Command):实现了命令接口,持有一个接收者对象的引用,并在 execute() 方法中调用接收者的相应操作。
  3. 接收者(Receiver):执行具体的业务逻辑,是命令真正的执行者。
  4. 调用者(Invoker):负责调用命令对象的 execute() 方法,它不关心具体的命令内容,只负责触发命令执行。
  5. 客户端(Client):创建具体命令对象,并将其关联到接收者和调用者。

代码示例

以下是一个简单的命令模式示例,模拟一个简单的家电控制系统,包含电灯的打开和关闭操作:

// 命令接口
interface Command {
    void execute();
    void undo();
}

// 接收者:电灯
class Light {
    public void turnOn() {
        System.out.println("Light is on");
    }

    public void turnOff() {
        System.out.println("Light is off");
    }
}

// 具体命令类:打开电灯命令
class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }

    @Override
    public void undo() {
        light.turnOff();
    }
}

// 具体命令类:关闭电灯命令
class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }

    @Override
    public void undo() {
        light.turnOn();
    }
}

// 调用者:遥控器
class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }

    public void pressUndoButton() {
        command.undo();
    }
}

// 客户端代码
public class CommandPatternExample {
    public static void main(String[] args) {
        // 创建接收者
        Light light = new Light();

        // 创建具体命令
        Command lightOnCommand = new LightOnCommand(light);
        Command lightOffCommand = new LightOffCommand(light);

        // 创建调用者
        RemoteControl remoteControl = new RemoteControl();

        // 设置命令并执行
        remoteControl.setCommand(lightOnCommand);
        remoteControl.pressButton();

        // 撤销操作
        remoteControl.pressUndoButton();

        // 设置另一个命令并执行
        remoteControl.setCommand(lightOffCommand);
        remoteControl.pressButton();

        // 撤销操作
        remoteControl.pressUndoButton();
    }
}

代码解释

  1. 命令接口 Command:定义了 execute()undo() 方法,分别用于执行命令和撤销命令。
  2. 接收者 Light:包含 turnOn()turnOff() 方法,用于控制电灯的开关。
  3. 具体命令类 LightOnCommandLightOffCommand:实现了 Command 接口,分别负责打开和关闭电灯,并提供了相应的撤销操作。
  4. 调用者 RemoteControl:通过 setCommand() 方法设置要执行的命令,通过 pressButton() 方法执行命令,通过 pressUndoButton() 方法撤销命令。
  5. 客户端代码:创建了接收者、具体命令和调用者,并进行命令的设置和执行。

优点

  1. 解耦请求和执行:命令模式将请求的发送者和接收者解耦,使得发送者不需要知道接收者的具体信息,只需要发送命令即可。
  2. 可扩展性:可以很容易地添加新的命令类,而不需要修改现有的调用者和接收者代码。
  3. 支持撤销和恢复:通过实现 undo() 方法,可以方便地实现命令的撤销和恢复功能。
  4. 支持队列和日志:可以将命令对象存储在队列中,实现命令的排队执行;也可以将命令记录到日志中,实现命令的回放和审计。

缺点

  1. 类的数量增加:随着命令的增加,会产生大量的具体命令类,导致系统的类数量增多,增加了系统的复杂度。
  2. 代码复杂度:对于简单的操作,使用命令模式可能会增加代码的复杂度,不太适合简单的场景。

应用场景

  1. 撤销和恢复功能:如文本编辑器的撤销和重做操作、游戏中的回退功能等。
  2. 队列和日志系统:如任务调度系统、事务处理系统等,将命令对象存储在队列中,按顺序执行。
  3. 菜单系统:如图形界面的菜单命令,每个菜单项对应一个命令对象,点击菜单项时执行相应的命令。
Java设计模式 文章被收录于专栏

设计模式是软件开发中针对反复出现的问题所总结归纳出的通用解决方案,它可以帮助开发者更高效地构建软件系统,提升代码的可维护性、可扩展性和可复用性。

全部评论

相关推荐

04-05 09:42
米哈游_服务器
一、认知纠偏:为什么说简历是人生第二次"高考"?1. 校招黄金定律:应届生身份=职场入场券的唯一性2. 数据真相:同一专业毕业生薪资差距可达300%+3. 核心公式:优质简历=精准岗位匹配度×成果可视化×求职策略二、简历撰写四步法(附模板框架)📌 Step1 岗位拆解术• 建立专属岗位数据库(建议用Excel管理)• 深度解析3个目标岗位JD(示例:游戏开发岗)• 提炼核心关键词:引擎开发/C++/图形学/Unity项目经验📌 Step2 经历重构术• 必杀技:STAR-L量化法则(Situation情景-Task任务-Action行动-Result结果-Learning收获)• 案例对比:× 原表述:"参与游戏开发社团"√ 重构后:"主导Unity横版闯关Demo开发,实现3D角色控制器与物理碰撞系统(C#),获校科创一等奖(前5%)"📌 Step3 技能包装术• 技术栈分层呈现法:核心技能(Unity/C++/Shader)|辅助技能(Python/MySQL)|行业认知(FPS游戏生态)• 作品集打造(程序向): 跟随b站教程打造岗位额相关demoGitHub源码规范|B站demo演示视频|技术博客链接(建议用短链生成器)(可以先上车后补票!先拟好简历再去恶补是ok的!只要后面进面试面试官问的能对答如流!)📌 Step4 精准投放策略• 建立3级投递梯队(冲刺/匹配/保底)• 定制化命名规则:姓名_岗位_核心优势.pdf(例:张三_游戏开发_Unity项目经验)三、简历优化进阶技巧(加分项)🎯 反模板设计:• 程序员简历:GitHub风格模板(附开源项目地址)• 设计岗简历:信息图表化呈现(需控制文件大小)🎯 数据魔法:• 转化率提升40%的秘诀:在经历描述中加入%(例:"通过A*算法优化NPC路径,场景加载效率提升27%")🎯 社交力软植入:• 学生干部经历的正确打开方式:"协调15人团队完成校GameJam48小时开发,提前6小时交付作品"四、避坑指南(血泪经验)❌ 海投陷阱:1份简历投100家≈100份无效投递❌ 自嗨式描述:"精通Office" vs "用VBA开发考勤系统,节省200+工时"❌ 致命格式问题:PDF版本混乱/手机预览错位检测五、3天行动计划表Day1:找到自己心仪且匹配岗位,STAR-L法重构3个核心经历+技术栈分层Day2:跟随教程恶补DemoDay3:作品集上线+定制3个版本简历【文末福利】找我内推米哈游可获得简历优先筛选特权哦!越早投递越早占领春招席位!求职路上快人一步!社招也请看我!!!博主已经帮助30+人上岸!你主动我们就会有故事!#内推# #米哈游#    #内推#   #春招#   #校招#   【校招内推码】 V2OIZ【校招传送门】miHoYo招聘https://jobs.mihoyo.com/m/?sharePageId=77710&recommendationCode=V2OIZ&isRecommendation=true#/campus/position【社招内推码】NTAM83i【社招传送门】https://jobs.mihoyo.com/m/?sharePageId=77711&recommendationCode=NTAM83i&isRecommendation=true#/position【有效日期】2.21-7.26【特别说明】* 建议各位同学根据岗位调整自己的简历,总结出自身优势,提升自己在春招中的岗位契合度&亮点#牛友职场人脉来了#  #春招#  #校招#  #社招#  #内推#  #米哈游#  欢迎所有校招社招同学!!
米哈游
|
校招
|
21个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务