命令模式
本文主要內容
- 命令模式說明
- 命令模式示例
1、命令模式說明
命令模式,將請求封裝成為物件,以便使用不同的請求、佇列或者日誌來引數化其他物件,命令模式也可以撤銷操作。
假設現有一個遙控器,可以程式設計,自定義功能。現在我們需要用遙控器來實現電燈的開關。我們當然可以在遙控器的程式碼中加很多 if
,實現開關電燈。但仔細想一想,電燈可能有很多品種,它們的具體實現可能有不同,如果要更換電燈,那就需要更改遙控器的程式碼。同時,遙控器是可程式設計的,今天這個按鈕是控制電燈的,明天它可能要去控制電視機了,怎麼辦呢?面對這種不確定的情況,就是要面向抽象介面程式設計,使用命令模式,將命令請求與命令的接收者解耦才行。

命令模式UML類圖
2、命令模式示例
public interface Command { //命令介面 public void execute(); } public class LightCommand implements Command{ private Action mAction; @Override public void execute() { mAction.action(); } public void setAction(Action action){ mAction = action; } } public interface Action { public void action(); } public class Light implements Action{ @Override public void action(){ System.out.println("開燈"); } } public class Main { public static void main(String[] args) { Action action = new Light(); LightCommand command = new LightCommand(); command.setAction(action); command.execute(); } }
程式碼比較簡單,我就不再詳細說明了。
其實在工作中,設計模式的應用是無所不在的。很多人在剛開始學習設計模式的時候,覺得學這東西哪天能用上呢?當自己開發新的需求,或者重構的時候,我經常會想這個地方應該怎麼寫更合理,怎麼寫更加容易擴充套件,怎麼寫程式碼更優雅,這就是設計模式的應用,雖然不至於說,一看到某個地方就想到用哪個設計模式,但這也是我們開始思索架構的開始。
回想這麼多的設計模式,工作中遇到難題,想不出用啥設計模式不要緊,學習這東西不能拘泥於形式。但我們記得一條就好,不要面向物件了,面向抽象程式設計就可以。比如說遙控器這個示例,其中一共有兩個不確定點:
- 電燈的種類不同,開關實現會有不同
- 遙控器的按鍵可程式設計,可能會更改用途
有一個不確定點,那就是一個抽象點,一個介面或者說基類。提出取這些介面,剩下的不就水到渠成了嗎?