設計模式:Command(命令)

一、Command定義

 未來自客戶端的請求傳入一個對象,無需瞭解這個請求激活的 動做或有關接受這個請求的處理細節。
這是一種兩臺機器之間通信聯繫性質的模式,相似傳統過程語 言的 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

技術延伸

一、能夠單個調用 
二、可使用多線程調用 
三、能夠設定手動和自動調用線程

相關文章
相關標籤/搜索