美文网首页程序员
你确定你真的会使用命令模式吗?来看看的大佬是怎么用的吧,真的很细

你确定你真的会使用命令模式吗?来看看的大佬是怎么用的吧,真的很细

作者: 程序员伟杰 | 来源:发表于2020-07-22 20:36 被阅读0次

    Java设计模式之命令模式

    命令模式是一种数据驱动设计模式,它属于行为型模式,请求以命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象。

    一、创建命令模式UML类图

    二、创建命令模式的步骤

    (1):创建命令接口Command
    (2):创建命令接收者LightReceiver
    (3):创建实现类LightOffCommand、LightOnCommand、NoCommand
    (4):创建命令操作者RemoteController

    (1):创建命令接口Command

    /**
     * @author YLY
     * @ClassName Command
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public interface Command {
        /**
         * 执行动作(操作)
         */
        void execute();
    
        /**
         * 撤销动作(操作)
         */
        void undo();
    }
    

    (2):创建命令接收者LightReceiver

    /**
     * @author YLY
     * @ClassName LightReceiver
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public class LightReceiver {
    
        public void on() {
            System.out.println("电灯打开了。。。");
        }
    
        public void off() {
            System.out.println("电灯关闭了。。。");
        }
    
    }
    

    (3):创建实现类LightOffCommand、LightOnCommand、NoCommand

    /**
     * @author YLY
     * @ClassName LightOffCommand
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public class LightOffCommand implements Command {
        /**
         * 聚合LightReceiver
         */
        private LightReceiver lightReceiver;
    
        public LightOffCommand(LightReceiver lightReceiver) {
            this.lightReceiver = lightReceiver;
        }
    
        @Override
        public void execute() {
            // 调用接受者的方法
            lightReceiver.off();
        }
    
        @Override
        public void undo() {
            // 调用接受者的方法
            lightReceiver.on();
        }
    }
    
    /**
     * @author YLY
     * @ClassName LightOnCommand
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public class LightOnCommand implements Command {
    
        /**
         * 聚合LightReceiver
         */
        private LightReceiver lightReceiver;
    
        public LightOnCommand(LightReceiver lightReceiver) {
            this.lightReceiver = lightReceiver;
        }
    
        @Override
        public void execute() {
            // 调用接受者的方法
            lightReceiver.on();
        }
    
        @Override
        public void undo() {
            // 调用接受者的方法
            lightReceiver.off();
        }
    }
    
    
    /**
     * @author YLY
     * @ClassName NoCommand 空命令用于初始化,防止空指针
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public class NoCommand implements Command {
        @Override
        public void execute() {
    
        }
    
        @Override
        public void undo() {
    
        }
    }
    

    (4):创建命令操作者RemoteController

    /**
     * @author YLY
     * @ClassName RemoteController
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public class RemoteController {
        /**
         * 开 按钮的命令数组
         */
        Command[] onCommands;
        Command[] offCommands;
    
        /**
         * 执行撤销的命令
         */
        Command undoCommand;
    
        /**
         * 初始化RemoteController
         */
        public RemoteController() {
            onCommands = new Command[5];
            offCommands = new Command[5];
            for (int i = 0; i < 5; i++) {
                onCommands[i] = new NoCommand();
                offCommands[i] = new NoCommand();
            }
        }
    
        /**
         * 给按钮设置命令
         *
         * @param no         按钮
         * @param onCommand
         * @param offCommand
         */
        public void setCommand(int no, Command onCommand, Command offCommand) {
            onCommands[no] = onCommand;
            offCommands[no] = offCommand;
        }
    
        /**
         * 按下开按钮
         */
        public void onButton(int no) {
            // 执行本次按下的按钮操作
            onCommands[no].execute();
    
            // 记录本次操作用于撤回
            undoCommand = onCommands[no];
        }
    
        /**
         * 按下关按钮
         */
        public void offButton(int no) {
            // 执行本次按下的按钮操作
            offCommands[no].execute();
    
            // 记录本次操作用于撤回
            undoCommand = offCommands[no];
        }
    
        /**
         * 按下撤销按钮
         */
        public void undoButton() {
            undoCommand.undo();
        }
    }
    
    

    使用Cient类来接受和执行命令

    /**
     * @author YLY
     * @ClassName Client
     * @Date 2020/7/21
     * @Version 1.0.2
     */
    public class Client {
        public static void main(String[] args) {
            // 创建电灯对象
            LightReceiver lightReceiver = new LightReceiver();
    
            // 创建电灯相关的开关命令
            LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
            LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
    
            //创建遥控器
    
            RemoteController remoteController = new RemoteController();
    
            remoteController.setCommand(0, lightOnCommand, lightOffCommand);
    
            System.out.println("按下灯的按钮,操作电灯");
            remoteController.onButton(0);
            remoteController.offButton(0);
            remoteController.undoButton();
        }
    }
    
    

    执行结果

    按下灯的按钮,操作电灯
    电灯打开了。。。
    电灯关闭了。。。
    电灯打开了。。。
    

    命令模式在spring的jdbcTemplate中运用,具体的实现方法是query()方法中的StatementCallback接口。

    最后

    感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

    相关文章

      网友评论

        本文标题:你确定你真的会使用命令模式吗?来看看的大佬是怎么用的吧,真的很细

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