未來自客戶端的請求傳入一個對象,無需瞭解這個請求激活的 動做或有關接受這個請求的處理細節。
這是一種兩臺機器之間通信聯繫性質的模式,相似傳統過程語 言的 CallBack功能。
解耦了發送者和接受者之間聯繫。 發送者調用一個操做,接受者接受請求執行相應的動做,由於使用Command模式解耦,發送者無需知道接受者任何接口。java
很多Command模式的代碼都是針對圖形界面的,它實際就是菜單命令,咱們在一個下拉菜單選擇一個命令時,而後會執行一些動做.python
將這些命令封裝成在一個類中,而後用戶(調用者)再對這個類進行操做,這就是Command模式,換句話說,原本用戶(調用者)是直接調用這些命令的,如菜單上打開文檔(調用者),就直接指向打開文檔的代碼,使用Command模式,就是在這二者之間增長一箇中間者,將這種直接關係拗斷,同時二者之間都隔離,基本沒有關係了.設計模式
顯然這樣作的好處是符合封裝的特性,下降耦合度,Command是將對行爲進行封裝的典型模式,Factory是將建立進行封裝的模式,
從Command模式,我也發現設計模式一個」通病」:好象喜歡將簡單的問題複雜化, 喜歡在不一樣類中增長第三者,固然這樣作有利於代碼的健壯性 可維護性 還有複用性.多線程
具體的Command模式代碼各式各樣,由於如何封裝命令,不一樣系統,有不一樣的作法.下面事例是將命令封裝在一個Collection的List中,任何對象一旦加入List中,實際上裝入了一個封閉的黑盒中,對象的特性消失了,只有取出時,纔有可能模糊的分辨出:ide
public interface Command { public abstract void execute(); } public class JavaPeople implements Command { @Override public void execute() { System.out.println("我是一個java工程師"); } } public class PythonPeople implements Command { @Override public void execute() { System.out.println("我是一個python工程師"); } } public class ScalaPeople implements Command { @Override public void execute() { System.out.println("我是一個scala工程師"); } } public class ManagerPeople { public static List<Object> produceRequests() { // TODO Auto-generated method stub List<Object> queue = new ArrayList<Object>(); queue.add(new JavaPeople()); queue.add(new PythonPeople()); queue.add(new ScalaPeople()); return queue; } } public class TestCommand { public static void main(String[] args) { // TODO Auto-generated method stub List<Object> queue = ManagerPeople.produceRequests(); for (Iterator<Object> it = queue.iterator(); it.hasNext(); ) //客戶端直接調用execute方法,無需知道被調用者的其它更多類的方法名。 ((Command)it.next()).execute(); } }
我是一個java工程師
我是一個python工程師
我是一個scala工程師spa
一、能夠單個調用
二、可使用多線程調用
三、能夠設定手動和自動調用線程