設計模式的基本思想:面向接口編程是核心。
命令模式的設計主要是是爲了完成請求調用者與請求接收者之間進行解耦。
命令模式將“請求”封裝成對象,以便使用不同的請求、隊列或者日誌來參數化其他對象。通過使用命令模式屏蔽掉命令接收者的任務的具體實現(要做的事情),從而做到命令的請求調用者不必知道命令接收的具體實現從而達到兩者解耦的目的。提供命名相關接口(方法)的通用性。
命令模式的UML圖如下:
Client負責創建一個具體的ConcreteCommand命令,同時給此命令設置一個命令接收者。
invoker負責在調用者持有一個命令對象,並在某時刻調用命令對象的具體執行方法。
Command是一個命令接口,調用命令對象的execute()方法,就可以讓接收者進行相關的動作。
Raceiver作爲命令的接收者來完成具體的操作。
具體實現如下:
package CommandModel;
public interface Command {
void execute();
}
———————————————————————
package CommandModel;
public class Light {
public void on(){
System.out.println("我是燈,我接受到了開燈的命令,打開了燈!");
}
}
———————————————————————
package CommandModel;
public class LightCommand implements Command {
private Light light;
public LightCommand(Light light){
this.light = light;
}
@Override
public void execute() {
// TODO Auto-generated method stub
light.on();
}
}
———————————————————————
package CommandModel;
public class RemoteControlTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SimpleRemoteContral src = new SimpleRemoteContral();
Light light = new Light();
//將燈與控制燈的命令進行綁定
LightCommand lightComm = new LightCommand(light);
//調用命令控制類對象來控制命令的執行
src.setCommand(lightComm);
//執行命令
src.startExecute();
}
}
———————————————————————
package CommandModel;
public class SimpleRemoteContral {
private Command slot;
//設置命令對象
public void setCommand(Command comm){
this.slot = comm;
}
//這行命令方法
public void startExecute(){
if(slot != null){
slot.execute();
}
}
}
使用了觀察者模式和命令模式,那麼兩者有什麼區別呢?