Java设计模式之-命令模式(Command)

命令模式将着眼点放在了一个命令,或更准确来说,用英文单词Command来表示,它是一发命令,一条指令,一次操作,一个动作。命令模式就是希望将Command的具体方法,封装在一个具体类中,然后通过对这个类的串联、封装、调用等进行原子化的操作或逆操作(撤销)将Command运用起来。

我们先来看一下命令模式的UML设计图:


命令模式

网上很多文章其实对Receive这个角色的意义没有正确地认识。它实际上作为方法(Action)的封装,更多地应该是用来作为回调方法储存业务逻辑的。

其实一个按钮(Button)的点击就可以看成一个命令模式,当我点击(click)时,其实后端调用了它所绑定的onClick方法,这个方法具体会执行什么代码,则是在Receiver中预先定义好的Action方法完成的。

public abstract class OnClickCommand{
    public abstract void onClick();
}

public class ConcreteClickCommand extends OnClickCommand{
    private Receiver receiver;

    public ConcreteClickCommand(Receiver r){
        this.receiver = r;
    }
    public void onClick(){
        receiver.action();
    }
}

当Invoker发生了Click操作时,就会调用Command的onClick方法进行反馈。而我们需要首先实现Receiver的Action并与ConcreteCommand绑定:

public class Receiver{
    public void action(){
        System.out.println("Someone clicks me!");
    }
}

在main函数中将Receiver的实例传入ConcreteClickCommand中,甚至于更经常的,我们使用匿名类实现方法并传入Command中。这样我们便使用了Command方法完成了一个Button被Click之后的回调。

这一过程实现了两点:

  1. 将方法封装在一个类中
  2. 将调用者与方法的实现者完全隔离

另外我们可以灵活的使用命令模式搭配其他设计模式进行如下操作:

  • 配合组合模式,可以实现的制作和执行;
  • 配合备忘录模式,可以实现一个命令的撤销;
  • 与单例模式和原型模式轮流切换,实现命令状态的保存和复制;

你可能感兴趣的:(Java设计模式之-命令模式(Command))