在程序设计中,经常会遇到一个对象需要调用另外一个对象的某个方法以达到某种目的,在此场景中,存在两个角色:请求发出者和请求接收者。发出者发出请求,接收者接收请求并进行相应处理。有时候,当需要对请求发出者和接收者进行解耦,即发出者中不能含有接收者的引用,如请求需要进行排队操作,或可能需要对请求进行取消操作等,在此类场景中,请求发出者此时若还是直接操作接收者,将无法满足此类需求。此时,我们可以使用命令模式。
在命令模式中,当一个对象请求另一个对象其调用方法时,不和被请求的对象直接打交道,而是把这种请求封装到一个命令的对象中,封装的手段是将请求封装在命令对象的一个方法中。命令模式的核心就是使用命令对象来封装方法调用。既请求者的请求,接受者调用方法。
下面以常见的首长对官兵下达命令为例:
1.定义官兵类:
class Soldier { public void zip(){
System.out.println("开始拉练30公里...");
} public void stand(){
System.out.println("开始站军姿2小时...");
} }
2.定义命令类:
class Command{ private Soldier solider; public Command(Soldier solider){
this.solider = solider;
} public void stand(){
solider.stand();
} public void zip(){
solider.zip();
} }
3.定义首长类:
class Chief { private Command command; public Chief(Command command) {
this.command = command;
} public void startStand() {
command.stand();
} public void startZip() {
command.zip();
}
}
4.测试:
public class CommandTest { public static void main(String[] args) {
Soldier soldier = new Soldier();
Command command = new Command(soldier);
Chief chief = new Chief(command);
chief.startStand();
} }