Java设计模式之命令模式

Posted 红日666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之命令模式相关的知识,希望对你有一定的参考价值。

一、定义:

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

二、角色:

命令模式UML类图:

1、Command:

定义命令的接口,声明执行的方法。

2、ConcreteCommand:

命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

3、Receiver:

接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

4、Invoker:

要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

5、Client:

创建具体的命令对象,并且设置命令对象的接收者。

三、具体实现:

1、定义Command,声明执行操作的接口:
/** Command角色:
 *  命令的接口,声明执行的方法。
 */
public interface Command 
    /**
     * 执行
     */
    void execute();

    /**
     * 撤销
     */
    void unDo();

2、定义ConcreteCommand具体实现,将一个接收者对象绑定于一个动作。
/**
 * ConcreteCommand角色:
 * 命令接口实现对象
 */
public class ConcreteCommand implements Command 

    /**
     * 持有一个接受者Receiver的引用,绑定一个特定的操作
     */
    private Receiver receiver;

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

    @Override
    public void execute() 
        receiver.action();
    

    @Override
    public void unDo() 
        receiver.unAction();
    

3、定义接收者Receiver,真正执行命令的对象:
/**
 * Receiver角色:
 * 接收者,真正执行命令的对象。
 */
public class Receiver 

    public void action() 
        System.out.println("执行一个命令");
    

    public void unAction() 
        System.out.println("撤销一个命令");
    

4、定义Invoker,要求该命令执行这个请求。
/**
 * Invoker角色:
 * 要求该命令执行这个请求。
 */
public class Invoker 

    /**
     * 调用者持有一个命令对象
     */
    private Command command;

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

    public Command getCommand() 
        return command;
    

    public void executeCommand() 
        command.execute();
    

    public void unExecuteCommand() 
        command.unDo();
    


5、定义Client,测试一下我们的命令模式。
/**
 * Client角色:
 * 创建一个具体命令对象并设定它的接收者。
 */
public class Client 
    public static void main(String[] args) 
        //创建命令的接受者
        Receiver receiver = new Receiver();

        //创建命令对象,并设置它的接受者
        Command command = new ConcreteCommand(receiver);

        // 创建命令执行者,并将相应的命令作为参数传递给Invoker
        Invoker invoker = new Invoker();
        invoker.setCommand(command);

        // 命令执行
        invoker.executeCommand();
        invoker.unExecuteCommand();
    

输出结果:

四、适用场景及优缺点:

1、适用场景:

1).系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2).系统需要在不同的时间指定请求、将请求排队和执行请求。
3).系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4).系统需要将一组操作组合在一起,即支持宏命令。

2、优点:

1).降低对象之间的耦合度。
2).新的命令可以很容易地加入到系统中。
3).可以比较容易地设计一个组合命令。
4).调用同一方法实现不同的功能

3、缺点:

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。



参考:
Java设计模式综述

以上是关于Java设计模式之命令模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式之命令模式

Java进阶篇设计模式之八 ----- 责任链模式和命令模式

设计模式之行为类模式PK

设计模式之命令模式20170719

设计模式之命令模式

设计模式之命令模式