美文网首页
【Java设计模式】行为型模式-命令模式

【Java设计模式】行为型模式-命令模式

作者: 灰色孤星 | 来源:发表于2018-10-27 22:23 被阅读0次

源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、命令模式解决的问题
2、命令模式的实现
3、命令模式的优缺点

一、为什么要使用命令模式?

在一些软件系统中,行为的请求者和行为的执行者通常是一种耦合关系,但是如果需要对行为进行记录、撤销或重做等操作时,这种耦合关系是无法实现的。

使用命令模式,正是为了实现行为请求者和行为执行者之间的解耦,使得行为在执行时可以进行某些操作,在执行后也可以进行某些操作。

二、命令模式的核心

1、Invoker调用者/请求者

请求的发送者,它不需要直接和请求的执行者直接发生关联,而是通过抽象命令类间接的和请求执行者发生关联。
Invoker持有Command类的引用

2、Command抽象命令类

3、ConcreteCommand具体命令类

通过调用接收者间接实现了请求,但是在调用之前和之后都可以进行某些操作完成记录、撤销或重做等操作。
ConcreteCommand持有Receiver的引用

4、Receiver接收者

接收者执行与请求相关的操作,具体实现对请求的业务处理。

5、Client客户端

在客户端创建调用者对象、具体命令类对象,同时指定请求接收者对象,因此请求的发送者和接收者之间没有直接的关联。

三、具体实现

1、Invoker调用者/请求者

/**
 * @ClassName Invoker
 * @Description 命令调用者
 * @Author xwd
 * @Date 2018/10/27 22:09
 */
public class Invoker {
    private Command command;//持有命令类的引用

    public Invoker(Command command) {
        this.command = command;
    }

    /**
     * @MethodName toMakeIt
     * @Descrition 执行请求
     * @Param []
     * @return void
     */
    public void toMakeIt(){
        command.execute();
    }
}

2、Command抽象命令类

/**
 * @InterfaceName Command
 * @Description 抽象命令类
 * @Author xwd
 * @Date 2018/10/27 22:08
 */
public interface Command {
    /**
     * @MethodName execute
     * @Descrition 命令执行。命令执行之前和之后可做自己想要的操作
     * @Param []
     * @return void
     */
    void execute();
}

3、ConcreteCommand具体命令类

/**
 * @ClassName ConcreteCommand
 * @Description 具体命令类
 * @Author xwd
 * @Date 2018/10/27 22:09
 */
public class ConcreteCommand implements Command{

    private Receiver receiver;//持有行为执行者的引用

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        System.out.println("准备转账!");
        receiver.change();
        System.out.println("转账善后!");
    }
}

4、Receiver接收者

/**
 * @ClassName Receiver
 * @Description 命令执行者
 * @Author xwd
 * @Date 2018/10/27 22:09
 */
public class Receiver {
    /**
     * @MethodName change
     * @Descrition 具体的请求:转账
     * @Param []
     * @return void
     */
    public void change(){
        System.out.println("转账!");
    }
}

5、Client客户端

/**
 * @ClassName Client
 * @Description 客户端
 * @Author xwd
 * @Date 2018/10/27 22:09
 */
public class Client {
    public static void main(String[] args) {
        Invoker  invoker = new Invoker(new ConcreteCommand(new Receiver()));
        invoker.toMakeIt();
    }
}

6、输出结果

输出结果

四、总结

1、优点

降低了系统的耦合度;新的命令可以很容易的添加到系统中

2、缺点

使用命令模式可能会导致某些系统有过多的具体命令类

3、开发中常见的场景:

  • Struts2中,action的整个调用过程中就有命令模式。
  • 数据库事务机制的底层实现
  • 命令的撤销和恢复

相关文章

网友评论

      本文标题:【Java设计模式】行为型模式-命令模式

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