设计模式-行为型-命令模式(Command)

来源:互联网 发布:物理tracker软件 编辑:程序博客网 时间:2024/05/18 13:26

定义

将一个请求封闭成一个对象,从而让你使用不同的请求把客户端参数化,对请求排除或者记录请求日志,可以提供命令的撤销和恢复功能

角色

抽象命令类(Command):声明需要执行的命令,一般要对外公布一个方法来执行命令

命令类:对抽象命令类中的方法进行实现

调用者(Invoker):负责调用命令

接收者(Receiver):负责接收并执行命令

客户端(Client):最终调用类

优点

  • 良好的封闭性(每个命令封装在一个命令类中)、扩展性
  • 降低对象之间的耦合度
  • 新的命令可以很容易地加入到系统中
  • 可以比较容易地设计一个组合命令
  • 调用同一方法实现不同的功能

缺点

  • 针对每一个命令都需要设计一个具体命令类,因此可能会导致系统存在大量的命令类
  • 命令过于简单时,本来几行代码可以搞定,这里就需要封装一个命令类

适用场景

  • 适用于大多数请求-响应模式的功能
  • 系统需要将请求调用者和请求接收者解耦时,可用命令模式使调用者和接收者不直接交互

类图

Command

package com.vapy.behavior.Command;/** *  * @author vapy *  */public abstract class Command {    public abstract void execute();}
package com.vapy.behavior.Command;/** *  * @author vapy *  */public class ConcreteCommand extends Command {    private Receiver receiver;    public ConcreteCommand(Receiver receiver) {        this.receiver = receiver;    }    public void execute() {        this.receiver.executeCommand();    }}
package com.vapy.behavior.Command;/** *  * @author vapy *  */public class Invoker {    private Command command;    public void setCommand(Command command) {        this.command = command;    }    public void action() {        this.command.execute();    }}
package com.vapy.behavior.Command;/** *  * @author vapy *  */public class Receiver {    public void executeCommand() {        System.out.println("执行命令");    }}
package com.vapy.behavior.Command;/** *  * @author vapy *  */public class Client {    public static void main(String[] args) {        Receiver receiver = new Receiver();        Command command = new ConcreteCommand(receiver);        Invoker invoker = new Invoker();        invoker.setCommand(command);        invoker.action();    }}

CommandResult
本文代码可在github查看:点击此处

6 0