最近學習到設計模式,現總結個人學習命令模式內容【注重的是命令發送者與命令執行者解耦 】。
上一篇:
定義
將“動作的請求者”從“動作的執行者”對象中解耦。命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。
優缺點
優點
解耦
發起命令者不要再知道具體接受者對象是什麼,如何實現的,命令對象會負責讓接收則只需請求的動作。
缺點
系統中出現過多的命令類,增加了系統的複雜對。
實現
角色
- Command:抽象命令接口.
- ConcreteCommand:具體命令.
- Receiver:最終執行命令的對象.
- Invoker:命令對象的入口.
代碼
Command對象接口以及具體命令
/* 命令接口
*/
public interface Command {
public void execute();
}
/*//類適配 收音機開機的命令
class RadioOpenCommand extends RadioAppliances implements Command{
@Override
public void execute() { this.open(); }
}*/
//對象適配[建議使用對象適配,因收音機可以有多類] 收音機開機的命令
class RadioOpenCommand implements Command{
Appliances appliances;
public RadioOpenCommand(Appliances appliances) {
this.appliances = appliances;
}
@Override
public void execute() { this.open(); }
}
//對象適配[建議使用對象適配,因收音機可以有多類] 收音關機機的命令
class RadioCloseCommand implements Command{
Appliances appliances;
public RadioCloseCommand(Appliances appliances) {
this.appliances = appliances;
}
@Override
public void execute() { this.appliances.close(); }
}
Receiver最終只需命令的對象,以及對象抽象類
/* 執行命令抽象類
*/
public abstract class Appliances {
public abstract void open();
public abstract void close();
}
//最終執行命令具體類
class RadioAppliances extends Appliances{
@Override
public void open() {
System.out.println("打開收音機...");
}
@Override
public void close() {
System.out.println("關閉收音機...");
}
}
Invoker:命令對象的入口.
public class Controller {
HashMap<Integer,Command> opendcoms=new HashMap<>();
HashMap<Integer,Command> colsecoms = new HashMap<>();
// 給我們的按鈕設置你需要的命令
public void setCommand(int no, Command opencom, Command closcom) {
opendcoms.put(no, opencom);
colsecoms.put(no, closcom);
}
//執行打開命令
public void open(int on){
opendcoms.get(on).execute();
}
//執行關閉命令
public void close(int on){
colsecoms.get(on).execute();
}
}
測試
命令模式重點在於命令發送者與命令執行者解耦
以上僅爲個人學習,如果錯誤望指出,謝謝。