zoukankan      html  css  js  c++  java
  • Java设计模式系列之命令模式

    命令模式(Command)的定义

    将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

    命令模式(Command)的适用性

        1.抽象出待执行的动作以参数化某对象。

        2.在不同的时刻指定、排列和执行请求。

        3.支持取消操作。

        4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。

        5.用构建在原语操作上的高层操作构造一个系统。

    命令模式(Command)的应用效果:
    1)command模式将调用操作的对象和实现该操作的对象解耦
    2)可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
    3)增加新的command很容易,无需改变已有的类

    命令模式(Command)的参与者

      1.Command

          声明执行操作的接口。

        2.ConcreteCommand

          将一个接收者对象绑定于一个动作。

          调用接收者相应的操作,以实现Execute。

        3.Client

          创建一个具体命令对象并设定它的接收者。

        4.Invoker

          要求该命令执行这个请求。

        5.Receiver

          知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。

    命令模式(Command)的UML类图

                

    具体的代码实现:

    第一步:定义Command,声明执行操作的接口

    //命令接口
    public interface Command {
    
        //执行操作
        public void excute();
        //撤销操作
        public void unDo();
    }

    第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。

    public class ConcreteCommand implements Command {
    
        // 持有一个接受者Receiver的引用,绑定一个特定的操作
        Receiver receiver;
    
        public ConcreteCommand(Receiver receiver) {
            this.receiver = receiver;
        }
    
        @Override
        public void excute() {
            // 接受者绑定执行动作
            receiver.action();
        }
    
        @Override
        public void unDo() {
            // 接受者绑定的撤销动作
            receiver.unAction();
        }
    }

    第三步:定义Receiver,知道如何实现与执行一个请求相关的操作

    public class Receiver {
    
        public void action() {
            System.out.println("执行一个命令");
        }
    
        public void unAction() {
            System.out.println("撤销一个命令");
        }
    }

    第四步:定义Invoker,要求该命令执行这个请求。

    public class Invoker {
    
        // 调用者持有一个命令对象
        Command command;
    
        public Command getCommand() {
            return command;
        }
    
        public void setCommand(Command command) {
            this.command = command;
        }
    
        // 执行命令
        public void excuteCommmand() {
            command.excute();
        }
    
        // 撤销命令
        public void undoCommand() {
            command.unDo();
        }
    }

    第五步:定义Clien,我们来测试一下我们的命令模式

    public class Client {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // 创建命令的接受者
            Receiver receiver = new Receiver();
            // 创建命令对象,并设定它的接受者
            Command command = new ConcreteCommand(receiver);
            // 创建命令执行者,并将相应的命令作为参数传递给Invoker
            Invoker invoker = new Invoker();
            invoker.setCommand(command);
            // Client端测试一下
            invoker.excuteCommmand();
            invoker.undoCommand();
        }
    
    }

    运行结果:

    执行一个命令
    撤销一个命令

    总结:

    1、在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作;
    2、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用;
    3、调用者可以接受命令当作参数,甚至在运行时动态的进行;
    4、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态;
    5、命令模式将发出请求的对象和执行请求的对象进行解耦;

  • 相关阅读:
    SQL日常维护的语句
    87岁老奶奶用微软自带画图软件绘画 惊艳了世人
    87岁老奶奶用微软自带画图软件绘画 惊艳了世人
    87岁老奶奶用微软自带画图软件绘画 惊艳了世人
    .NET开源项目小功能组件
    .NET开源项目小功能组件
    .NET开源项目小功能组件
    常用 SQL Server 规范集锦
    常用 SQL Server 规范集锦
    常用 SQL Server 规范集锦
  • 原文地址:https://www.cnblogs.com/ysw-go/p/5413814.html
Copyright © 2011-2022 走看看