Java設計模式-命令模式

最近學習到設計模式,現總結個人學習命令模式內容【注重的是命令發送者與命令執行者解耦 】。
上一篇:

定義

將“動作的請求者”從“動作的執行者”對象中解耦。命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。

優缺點

優點

解耦
發起命令者不要再知道具體接受者對象是什麼,如何實現的,命令對象會負責讓接收則只需請求的動作。

缺點

系統中出現過多的命令類,增加了系統的複雜對。

實現

角色

  • 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();
	}
}

測試

在這裏插入圖片描述

命令模式重點在於命令發送者與命令執行者解耦
以上僅爲個人學習,如果錯誤望指出,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章