命令設計模式初探索
在我之前接觸過的設計模式中,有模版設計模式,單例模式,在閱讀《Java程式設計思想》第21章第2節時,有提到命令設計模式,我覺得這時候去學習它會更有意義。
所謂命令,它不是孤立存在的,它必須有下發命令的人以及接收命令的人,例如,老闆命令產品汪這個月產品必須上線,老婆命令我不許在外面過夜。老闆可以命令我做很多事情,當然,老婆更是可以,這其中,只是命令不同罷了。
把這種問題放到編碼中,我會怎麼做?
首先,本著面對物件設計原則,以及對問題的分析,我大概知道自己要定義3個類:
- 傳送命令的類CommandSender
- 執行命令的類CommandAccepter
- 命令類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();
}
}
以上,是我對命令設計模式的完全自主的初步探索,人們總結出來的命令設計模式是這樣的嗎?