命令模式

发布时间: 更新时间: 总字数:784 阅读时间:2m 作者: IP上海 分享 网址

Encapsulate a request as an object ,thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

命令模式介绍

通用类图如下:

command

命令模式分析

优点:

  • 将调用操作的对象与知道如何实现该操作的对象解耦。
  • 可以将多个命令装配成一个复合的命令。
  • 增加新的命令很容易,无需改变已有的类。
  • 类间解耦,调用者角色与接收者之间没有任何依赖关系。
  • 可以与我的兄弟职责链模式结合,实现命令族解析任务,与模板方法结合,可以减少命令子类膨胀的问题。

缺点:

  • 若命令有上千个,就需要有上千个类,类膨胀过于严重,但是可以结合模板方法,减少类的膨胀。

命令模式之实现

Golang

Java

那我们就拿老师与小明的故事来实现一下命令模式,首先自然是接收命令的人的抽象类了:

public abstract class Receiver{
    //抽象接受者,定义接受者所需要完成的业务
    public abstract void out();

}

这里定义了一个抽象类,以及一个抽象方法:出去。

然后是具体的接收者的实现类,可以是小墙、小东、小西等等,这里拿小明举栗子:

public class XiaoMing extends Receiver{
    //接受者执行的命令
    public void out(){
        System.out.println("小明,滚出去。");
    }
}

接下来是command的抽象类:

public abstract class Command{
    //每个命令执行一个方法
    public abstract void execute();
}

之后是具体的Command的实现类:

public class ConcreteCommand extends Command{
    //对相应的Receiver类进行命令处理
    private Receiver receiver;
    //构造函数传递接受者
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }

    //实现一个命令
    public void execute(){
        this.receiver.out();
    }
}

最后是Invoker类的代码实现:

public class Invoker{
    private Command command;
    //接收命令

    public void setCommand(Command command){
        this.command = command;
    }

    //执行命令
    public void action(){
        this.commadn.execute();
    }
}

经调用之后,就是我们常见的:小明,滚出去了。额,感觉有哪里不对。

命令模式之应用场景

在以下的场景中,可以使用Command模式来实现:

  • 不同的时刻、排列和执行请求。
  • 支持取消操作。
  • 支持修改日志。
  • 用构建在原语操作上的高层操作构造一个系统。
  • 与 Composite 和 chain of responsibility 一起使用
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数