1. 程式人生 > >命令設計模式初探索

命令設計模式初探索

在我之前接觸過的設計模式中,有模版設計模式,單例模式,在閱讀《Java程式設計思想》第21章第2節時,有提到命令設計模式,我覺得這時候去學習它會更有意義。
所謂命令,它不是孤立存在的,它必須有下發命令的人以及接收命令的人,例如,老闆命令產品汪這個月產品必須上線,老婆命令我不許在外面過夜。老闆可以命令我做很多事情,當然,老婆更是可以,這其中,只是命令不同罷了。
把這種問題放到編碼中,我會怎麼做?
首先,本著面對物件設計原則,以及對問題的分析,我大概知道自己要定義3個類:

  1. 傳送命令的類CommandSender
  2. 執行命令的類CommandAccepter
  3. 命令類Command

老闆作為CommandSender,可以對所有員工發命令,顯然,不能把CommandAccepter作為send()的引數,我們要把CommandSender和CommandAccepter的關係解耦。

public class CommandSender{
	public void send(){
		//這裡要執行什麼操作呢?
	};
}

雖然,我不能把具體的Command與CommandSender繫結,但是,我可以把Command抽象為介面,這樣Command可以派生出許多實現類。

public interface Command{
	void excute();
}

這樣,Boss就可以傳送命令了,Boss相當於在說:幹活!

public class CommandSender{
	public void send(Command c){
		c.excute();
	}
}

手下的員工接到幹活的命令,都開始幹活了:程式設計師寫程式,財務計算工資,HR面試…
程式設計師,財務,HR都是CommandAccepter,他們都以自己的方式執行“幹活”這個命令。
因此,CommandAccepter是一個抽象類,內部有一個抽象的excute():

public abstract class CommandAccepter{
	abstract void excute();
}

某一天,老闆說:寫程式碼。老闆是沒有說誰去寫程式碼的,我們知道的是,程式設計師能完成寫程式碼的命令。

public class Programmer extends CommandAccepter{
	public void excute(){
		//這裡填寫命令接受者完成命令的具體程式碼	
	}
	
}

寫程式碼的Command

public class Code implements Command{
	public void excute(){
	
	}
}

每一種型別的Command實現類,都應該有一個CommandAccepter屬性。程式設計師寫程式碼,HR招人,財務算工資。每一個Command物件,都會有一個CommandAccepter物件去excute。

public class Code implements Command{
	private final CommandAccepter  ca;//把CommandAccepter物件定義為final的。
	public Code(){
		//在構造器中,指定CommandAccepter
		ca = new Programmer();
	}
	public void excute(){
		ca.excute();
	}
}

以上,是我對命令設計模式的完全自主的初步探索,人們總結出來的命令設計模式是這樣的嗎?