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

    }
}

总结

  • 优点

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

    • 过多的命令会导致系统中存在过多的具体命令类
相关推荐
In_life 在生活9 小时前
设计模式(四)装饰器模式与命令模式
设计模式
瞎姬霸爱.9 小时前
设计模式-七个基本原则之一-接口隔离原则 + SpringBoot案例
设计模式·接口隔离原则
鬣主任10 小时前
Spring设计模式
java·spring boot·设计模式
程序员小海绵【vincewm】12 小时前
【设计模式】结合Tomcat源码,分析外观模式/门面模式的特性和应用场景
设计模式·tomcat·源码·外观模式·1024程序员节·门面模式
丶白泽12 小时前
重修设计模式-行为型-命令模式
设计模式·命令模式
gjh120815 小时前
设计模式:工厂方法模式和策略模式
设计模式·工厂方法模式·策略模式
shinelord明16 小时前
【再谈设计模式】抽象工厂模式~对象创建的统筹者
数据结构·算法·设计模式·软件工程·抽象工厂模式
前端拾光者18 小时前
前端开发设计模式——责任链模式
设计模式·责任链模式
liang899918 小时前
设计模式之策略模式(Strategy)
设计模式·策略模式
马剑威(威哥爱编程)19 小时前
读写锁分离设计模式详解
java·设计模式·java-ee