命令模式将发出命令的对象和执行命令的对象解耦。
发出命令的对象是遥控器(调用者),执行命令的对象是电视(接收者)。
如何将调用者和接收者解耦:
利用命令对象,把命令(例如打开电视机)封装成一个命令对象。
让遥控器按钮存储一个命令对象,那么当按钮被按下的时候,就可以使用命令对象做相关的工作。
遥控器并不需要知道工作内容是什么,只要有一个命令对象和遥控器沟通,把电视打开就可以了。 这样遥控器和电视就解耦了。
在被解耦的两者之间是通过命令对象进行沟通的。
命令对象封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。
package com.ez.impl;
import com.ez.Command;
/**
* 命令模式,将发出命令的对象(遥控器)和执行命令的对象(电视机)解耦。
* @author 窗外赏雪(EZ编程网)
*/
public class Test {
public static void main(String[] args) {
//创建一台电视机,就是命令的接收者
TV tv=new TV();
//命令对象封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。
Command command=new TVOnCommand(tv);
//调用者,传入一个命令对象,可以执行命令
Telecontroller telecontroller = new Telecontroller();
telecontroller.setCommand(command);
telecontroller.buttonPress();
}
}
package com.ez;
/**
* 命令接口,所有的命令对象实现该接口
* @author 窗外赏雪(EZ编程网)
*/
public interface Command {
void execute();
}
package com.ez.impl;
import com.ez.Command;
/**
* 命令对象,封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,
* 当此方法被调用的时候,接收者就会进行这些动作。
* @author 窗外赏雪(EZ编程网)
*/
public class TVOnCommand implements Command{
TV tv;
public TVOnCommand(TV tv) {
this.tv = tv;
}
@Override
public void execute() {
tv.on();
}
}
package com.ez.impl;
/**
* 命令接收者
* @author 窗外赏雪(EZ编程网)
*/
public class TV {
public void on(){
System.out.println("打开电视机");
}
}
package com.ez.impl;
import com.ez.Command;
/**
* 发出命令的对象是遥控器(调用者),持有一个命令对象。
* @author 窗外赏雪(EZ编程网)
*/
public class Telecontroller {
private Command command;
public Telecontroller() {}
public void setCommand(Command command) {
this.command = command;
}
//按下按钮,发出命令,调用命令对象的execute()方法
public void buttonPress(){
command.execute();
}
}
应用场景:
工作队列对象不在乎到底做些什么,它们只知道取出命令对象,然后调用其execute()方法。类似地,它们只要是实现命令模式的对象,就可以放入队列中,当线程可用时,就调用此对象的execute()方法。