在軟件開發(fā)中,我們經(jīng)常需要向某些對象發(fā)送請求(調(diào)用其中的某個或某些方法)嘴秸,但是并不知道請求的接收者是誰合溺,也不知道被請求的操作是哪個卒密,此時,我們特別希望能夠以一種松耦合的方式來設(shè)計軟件棠赛,使得請求發(fā)送者與請求接收者能夠消除彼此之間的耦合哮奇,讓對象之間的調(diào)用關(guān)系更加靈活膛腐,可以靈活地指定請求接收者以及被請求的操作。命令模式為此類問題提供了一個較為完美的解決方案屏镊。
命令模式可以將請求發(fā)送者和接收者完全解耦依疼,發(fā)送者與接收者之間沒有直接引用關(guān)系,發(fā)送請求的對象只需要知道如何發(fā)送請求而芥,而不必知道如何完成請求律罢。
命令模式定義如下:
命令模式(Command Pattern):將一個請求封裝為一個對象,從而讓我們可用不同的請求對客戶進(jìn)行參數(shù)化棍丐;對請求排隊或者記錄請求日志误辑,以及支持可撤銷的操作。命令模式是一種對象行為型模式歌逢,其別名為動作(Action)模式或事務(wù)(Transaction)模式巾钉。
命令模式的定義比較復(fù)雜,提到了很多術(shù)語秘案,例如“用不同的請求對客戶進(jìn)行參數(shù)化”砰苍、“對請求排隊”,“記錄請求日志”阱高、“支持可撤銷操作”等赚导,在后面我們將對這些術(shù)語進(jìn)行一一講解。
命令模式的核心在于引入了命令類赤惊,通過命令類來降低發(fā)送者和接收者的耦合度吼旧,請求發(fā)送者只需指定一個命令對象,再通過命令對象來調(diào)用請求接收者的處理方法
命令發(fā)出者與命令接收者之間實現(xiàn)松耦合未舟。
實例:簡易計算器
計算器界面類CalculatorForm充當(dāng)請求發(fā)送者圈暗,實現(xiàn)了數(shù)據(jù)求和功能的加法類Adder充當(dāng)請求接收者,界面類可間接調(diào)用加法類中的add()方法實現(xiàn)加法運算裕膀,并且提供了可撤銷加法運算的undo()方法员串。
代碼:
抽象命令類:
public abstract class AbstractCommand {
public abstract int excute(int value);
public abstract int undo();
}
具體命令類:
public class ConcreteCommand extends AbstractCommand {
private Add add = new Add();
private int value;
@Override
public int excute(int value) {
this.value = value;
return add.add(this.value);
}
@Override
public int undo() {
return add.add(-value);
}
}
具體接收者:
public class Add {
private int num =0;
public int add(int value){
num += value;
return num;
}
}
請求發(fā)送者:
public class CaculateForm {
private AbstractCommand command;
public void setCommand(AbstractCommand command){
this.command = command;
}
public void comput(int value){
int i = command.excute(value);
System.out.println("after add the result is :"+ i);
}
public void undo(){
int i = command.undo();
System.out.println("after undo the result is :"+ i);
}
}
測試代碼:
CaculateForm ca = new CaculateForm();
AbstractCommand com = new ConcreteCommand();
ca.setCommand(com);
ca.comput(3);
ca.comput(4);
ca.undo();
ca.undo();