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

    }
}

总结

  • 优点

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

    • 过多的命令会导致系统中存在过多的具体命令类
相关推荐
小白不太白9508 小时前
设计模式之 模板方法模式
java·设计模式·模板方法模式
色空大师9 小时前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)9 小时前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
博风10 小时前
设计模式:6、装饰模式(包装器)
设计模式
A_cot10 小时前
理解设计模式与 UML 类图:构建稳健软件架构的基石
microsoft·设计模式·简单工厂模式·工厂方法模式·uml
君败红颜10 小时前
设计模式之创建模式篇
设计模式
闲人一枚(学习中)13 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白95015 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白95016 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in17 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式