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

命令模式 —— 上令下达

作者: 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 不产生严重的代码耦合。

    命令模式的缺点:

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

    相关文章

      网友评论

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

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