大话设计模式——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();

    }
}

总结

  • 优点

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

    • 过多的命令会导致系统中存在过多的具体命令类
相关推荐
雪度娃娃2 小时前
设计模式-UML
设计模式
kyriewen113 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
开发语言·前端·javascript·设计模式·ecmascript
geovindu10 小时前
go: Mediator Pattern
设计模式·golang·中介者模式
kyriewen15 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
Pkmer1 天前
古法编程: 适配器模式
java·设计模式
灰子学技术2 天前
Envoy 使用的设计模式技术文档
设计模式
Carl_奕然2 天前
【智能体】Agent的四种设计模式之:ReAct
人工智能·设计模式·语言模型
二哈赛车手2 天前
新人笔记---多策略搭建策略执行链实现RAG检索后过滤
java·笔记·spring·设计模式·ai·策略模式
楼田莉子2 天前
仿Muduo的高并发服务器:Channel模块与Poller模块
linux·服务器·c++·学习·设计模式
geovindu3 天前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式