美文网首页
命令模式 —— 上令下达

命令模式 —— 上令下达

作者: lfeilu | 来源:发表于2020-04-04 16:23 被阅读0次

生活的理想,就是为了理想的生活。——张闻天

1、定义

命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式。

意思是:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
简单来说,命令模式就是将发送者、接收者和调用命令封装成对象,客户端调用的时候可以选择不同的对象,从而实现发送者和接收者的完全解耦。

2、组成角色

命令模式包含如下角色:

  • 命令接口(Command)角色:该角色声明一个接口,定义需要执行的命令;
  • 具体命令实现类(Concrete Command)角色:该角色定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作;
  • 调用者(Invoker)角色:该角色负责调用命令对象执行请求;
  • 接收者(Receiver)角色:该角色负责具体实施和执行请求动作(方法);
  • 客户端(Client)角色:串连执行整个流程。


    image.png

3、使用实例

命令接口和命令实现类

public interface Command {
    void execute();
}

public class OpenTvCommand implements Command {
    HuaWeiTv tv;
    public OpenTvCommand(HuaWeiTv tv){
        this.tv = tv;
    }
    @Override
    public void execute() {
        tv.open();
    }
}

public class ChangeTvCommand implements Command {
    HuaWeiTv tv;
    public ChangeTvCommand(HuaWeiTv tv){
        this.tv = tv;
    }
    @Override
    public void execute() {
        tv.change();
    }
}

public class CloseTvCommand implements Command {

    HuaWeiTv tv;
    public CloseTvCommand(HuaWeiTv tv){
        this.tv = tv;
    }

    @Override
    public void execute() {
        tv.close();
    }
}

接收者(执行命令)

public class HuaWeiTv {

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

    public void change(){
        System.out.println("切换频道");
    }

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

执行者(发起执行命令对象)

public class RemoteControl {

    private OpenTvCommand openTvCommand;
    private ChangeTvCommand changeTvCommand;
    private CloseTvCommand closeTvCommand;

    public RemoteControl(OpenTvCommand openTvCommand,ChangeTvCommand changeTvCommand,CloseTvCommand closeTvCommand){
        this.openTvCommand = openTvCommand;
        this.changeTvCommand = changeTvCommand;
        this.closeTvCommand = closeTvCommand;
    }

    public void open(){
        openTvCommand.execute();
    }

    public void change(){
        changeTvCommand.execute();
    }

    public void close(){
        closeTvCommand.execute();
    }
}

客户端类

public class Main {
    public static void main(String[] args) {
        HuaWeiTv huaWeiTv = new HuaWeiTv();
        OpenTvCommand open = new OpenTvCommand(huaWeiTv);
        ChangeTvCommand change = new ChangeTvCommand(huaWeiTv);
        CloseTvCommand close = new CloseTvCommand(huaWeiTv);

        RemoteControl remoteControl = new RemoteControl(open,change,close);
        remoteControl.open();
        remoteControl.change();
        remoteControl.close();
    }
}

测试结果

打开电视
切换频道
关闭电视

4、总结

命令模式的优点:

  • 类间解耦:调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需要调用 Command 中的 execute() 方法即可,不需要了解是哪个接收者执行;
  • 可扩展性:Command 的子类可以非常容易地扩展,而调用者 Invoker 和高层次的模块 Client 不产生严重的代码耦合。

命令模式的缺点:

  • 使用命令模式会导致系统有过多的具体命令类,因为针对每一个命令都需要设计一个具体命令类。

相关文章

  • 命令模式 —— 上令下达

    生活的理想,就是为了理想的生活。——张闻天 1、定义 命令模式(Command Pattern)又称为行动(Act...

  • 函数防抖和节流

    防抖 防抖(debounce): 如果下达命令后,在t毫秒内再次下达该命令,则取消刚刚下达的命令,只执行新命令 最...

  • 函数防抖和函数节流

    防抖(debounce) 如果下达该命令后,在t毫秒内再次下达该命令,则取消刚刚下达的命令,只执行新命令 最终效果...

  • 设计模式-命令模式

    介绍 说到命令模式,我们可以联想到上级下达命令,下级接收命令去执行,遥控器发送命令,相应的机器做出反应。就比如电灯...

  • 日更二十八

    41. 其身正,不令而行;其身不正,虽令不从。 自身品行端正,即使不下达命令,群众也会自觉去做;自身品行不端正,即...

  • 日更十六 论语5

    41. 其身正,不令而行;其身不正,虽令不从。 自身品行端正,即使不下达命令,群众也会自觉去做;自身品行不端正,即...

  • 五种下达命令的方法

    命令的下达其实是很有艺术的,好的下达命令的方式既能让人接受,又能感觉很舒服,而乐于去执行命令。 不好的下命令下达方...

  • 依状况下达命令

    依状况下达命令,就是看到状况就能够自己对自己下达命令,不需要等待上级下达命令再去做。 管理者应该确实掌握组织全体的...

  • 红蜻蜓如何做到线下转线上

    组织模式:从层层下达命令,转变为指挥部端对端指挥模式 线下线上:从并联关系,转变为串联关系 管理模式:从业绩结果管...

  • 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a reques...

网友评论

      本文标题:命令模式 —— 上令下达

      本文链接:https://www.haomeiwen.com/subject/tvsjphtx.html