大话设计模式——16.命令模式(Command Pattern)

简介

请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的对象进行执行。命令模式是一种特殊的策略模式,体现多个策略执行的问题,而不是选择的问题

UML图
应用场景
  • 界面选择、键盘、按钮、事件操作都类似命令模式

示例

电视遥控器、电视、观看电视的人

  1. 接收者:电视机
java 复制代码
public class TVReceiver {

    public void on() {
        System.out.println("打开电视");
    }

    public void off() {
        System.out.println("关闭电视");
    }

    public void changeStation() {
        System.out.println("换台");
    }
}
  1. 命令(指令):
java 复制代码
public interface Command {

    void excute();
}
java 复制代码
public class OnCommand implements Command {


    private TVReceiver tvReceiver;

    public OnCommand(TVReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

    @Override
    public void excute() {
        System.out.println("onCommand----execute");
        tvReceiver.on();
    }
}
java 复制代码
public class OffCommand implements Command {


    private TVReceiver tvReceiver;

    public OffCommand(TVReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

    @Override
    public void excute() {
        System.out.println("OffCommand----execute");
        tvReceiver.off();
    }
}
java 复制代码
public class ChangeStationCommand implements Command {


    private TVReceiver tvReceiver;

    public ChangeStationCommand(TVReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

    @Override
    public void excute() {
        System.out.println("ChangeStationCommand----execute");
        tvReceiver.changeStation();
    }
}
  1. 调用者:观看者
java 复制代码
public class Invoker {

    private OnCommand onCommand;

    private OffCommand offCommand;

    private ChangeStationCommand changeStationCommand;

    public OnCommand getOnCommand() {
        return onCommand;
    }

    public void setOnCommand(OnCommand onCommand) {
        this.onCommand = onCommand;
    }

    public OffCommand getOffCommand() {
        return offCommand;
    }

    public void setOffCommand(OffCommand offCommand) {
        this.offCommand = offCommand;
    }

    public ChangeStationCommand getChangeStationCommand() {
        return changeStationCommand;
    }

    public void setChangeStationCommand(ChangeStationCommand changeStationCommand) {
        this.changeStationCommand = changeStationCommand;
    }


    /**
     * 开
     */
    public void on() {
        onCommand.excute();
    }

    /**
     * 关
     */
    public void off() {
        offCommand.excute();
    }

    /**
     * 换台
     */
    public void changeStation() {
        changeStationCommand.excute();
    }
}
  1. 运行
java 复制代码
public class Main {

    public static void main(String[] args) {
        // 创建接收者(物品)
        TVReceiver tvReceiver = new TVReceiver();

        // 创建指令(遥控器)
        OnCommand onCommand = new OnCommand(tvReceiver);
        OffCommand offCommand = new OffCommand(tvReceiver);
        ChangeStationCommand changeStationCommand = new ChangeStationCommand(tvReceiver);

        // 创建使用者
        Invoker invoker = new Invoker();
        invoker.setOffCommand(offCommand);
        invoker.setOnCommand(onCommand);
        invoker.setChangeStationCommand(changeStationCommand);

        // 使用者作出指示
        invoker.on();
        System.out.println("------------");
        invoker.changeStation();
        System.out.println("------------");
        invoker.off();

    }
}

总结

  • 优点

    • 调用者对象与接受者对象没有任何依赖关系,降低了系统的耦合度
    • 方便新的命令添加至系统中,扩展性强
  • 缺点

    • 过多的命令会导致系统中存在过多的具体命令类
相关推荐
苏渡苇4 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日4 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.5 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon6 小时前
七大设计原则介绍
设计模式
YigAin8 小时前
Unity23种设计模式之 享元模式
设计模式·享元模式
不绝19121 小时前
UGUI相关——基础篇
命令模式
范纹杉想快点毕业21 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑1 天前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲1 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头1 天前
设计模式与C语言高级特性的结合
c语言·设计模式