1. 程式人生 > >設計模式筆記之十命令模式

設計模式筆記之十命令模式

命令模式

為什麼引用命令模式

當需求變動比較頻繁,如果沒有一個具體的負責人的話,那我們每次都必須將專案相關人員帶上,去和客戶討論需求,這樣做的結果是人力成本過高,而且過去麻煩,如果可以有個負責人,負責只需接受客戶的命令需求,就立刻通知相關負責部門進行執行就可以方便很多了,這就是為什麼引入命令模式。

命令模式是什麼

將一個請求封裝為一個物件,從而可用不同的請求對客戶進行引數化,對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。

核心思想

Command:命令介面,提供所有命令實現類必須實現的方法。

ConcreteCommand:具體命令,包含Receiver物件,通過Execution方法,呼叫Receiver的Action方法。

Invoker:呼叫者,包含一個command物件,可以執行command的execute()方法

Receiver:接受者,定義了接受者該做的操作,不同的具體接受者可以實現不同的操作。

具體案例

按鈕點選,接受到點選不同的按鈕,實現不同的功能,使用命令模式實現。

UML:

程式碼

package com.dong.Command;

public interface Button {
	public void Execute();
}

package com.dong.Command;

public class CloseButtonReceiver {
	public void Do() {
		System.out.println("Close the machine");
	}
}

package com.dong.Command;

public class OpenButtonReceiver {
	public void Do() {
		System.out.println("Start the machine ");
	}
}

package com.dong.Command;

public class BlueButton implements Button {
	private CloseButtonReceiver receiver;

	public BlueButton(CloseButtonReceiver receiver) {
		this.receiver = receiver;
	}
	
	@Override
	public void Execute() {
		// TODO Auto-generated method stub
		receiver.Do();
	}

}

package com.dong.Command;

public class RedButton implements Button {
	
	public OpenButtonReceiver receiver ;
	
	public RedButton(OpenButtonReceiver receiver) {
		this.receiver = receiver;
	}
	@Override
	public void Execute() {
		receiver.Do();
	}

}

package com.dong.Command;

public class Invoker {
	
	private Button button;
	
	public void setButton(Button button) {
		this.button = button;
	}
	public void action() {
		this.button.Execute();
	}
}

package com.dong.Command;
/**
 * 執行結果:
 *  Start the machine 
 *  Close the machine
 * @author liuD
 *
 */
public class client {
	public static void main(String[] args) {
		//負責人,負責接收命令,分配任務,讓具體的執行者執行
		Invoker invoker  = new Invoker(); 
		//不同的接受者,即執行命令的主體,可以由多個接受者,每個接受的執行方式不同
		OpenButtonReceiver receiver =new OpenButtonReceiver();
		//將命令傳遞給特定的接受者
		Button redbutton = new RedButton(receiver);
		//負責人將命名分配給特定的負責人
		invoker.setButton(redbutton);
		//負責人讓具體接受人開始幹活,具體的接受者開始執行相應的操作。
		invoker.action();
		
		CloseButtonReceiver creceiver = new CloseButtonReceiver();
		Button bluebutton = new BlueButton(creceiver);
		invoker.setButton(bluebutton);
		invoker.action();
	}
}

優點

命令的接受者和執行者實現分離,解耦,

一個命令可以對應多個接受者,每個接受者可以執行不同的操作,擴充套件容易。

缺點

如果命令過多,則子類就需要更多。