• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
             看到有些朋友很喜歡用軟命令的方式來提供接口, 什么是軟命令, 其實就是一個接口,根據參數的不同,可以實現N多的功能(我不知道"軟命令"這名詞是我原創還是現有的,我們暫時就這樣稱呼吧).

            看看現實中有哪些產品已經成功應用了這種特性?

            首先想到是的是windows窗口的消息處理函數,用C的方式是類似這樣:
            LRESULT MessageProc(HWND hWnd, UINT nMsgType, WPARAM wParam, LPARAM lParam);

            用C++實現是類似這樣
            class CWindow
            {
            public:
            LRESULT MessageHander(UINT nMsgType, WPARAM wParam, LPARAM lParam);
            };
            當然里面實現時會有一堆switch case.

            接下來會想到COM里IDispatch接口的Invoke函數,外部無論調用對象的什么方法或屬性,都通過這個自動化接口。

            再往廣義上想,DOS里的命令行,Windbg的操作命令等,其實都是"軟命令"。

            再廣一點, 整個Web服務器就是一個"軟命令"入口,比如URL API,都是通過一個單獨的Http請求入口,可以實現各種各樣的任務。

            我們對上面的例子進行抽象,就會發現他們的共性是對外接口固定,但是內部功能確是可以擴充,很符合開放封閉這條設計原則。往設計模式上考慮, 其實就是單一入口的Facade模式。

            這么方便的接口,那么是不是在我們平時的設計中應該盡量使用呢? 我看未必。 如果按照這種設計,任何類都只要一個MethodCallRequest方法就好了,根據這個入口,我會根據你的命令類型,調用相應的方法。如果你真的所有的類都這樣做了,等類層次一復雜,我看你的代碼就不用維護了。當然也有語言確實是這么做的,比如Objective-c, 它內部對象的每個函數調用,都是通過查找對象的function table, 然后再調用對應的function,但它的前提是語言本身提供這個特性。但是像C++這種靜態強類型的語言,讓對象的每個方法有明確的用途,讓編譯器幫你檢測對象是不是有相應的方法,一來清晰,而來高效,何樂而不為?

            那么究竟什么時候適用這種接口方式呢?

            我的看法是只有當你的模塊是一個單獨的子系統,當對外提供功能時,才可以這么做。這里的子系統不一定要是一個很大的概念,比如一個窗口,一個COM對象都可以稱為簡單的子系統,但是它的前提要求是獨立,對外,并且最好你可以預見到以后它的功能會改變和擴充。

            那么有沒有不用這種"軟命令"的接口方式,但是我也可以不斷擴充對象提供的方法呢? 有的,設計模式里的Visitor模式就是為此而準備的,這里就不多說了。
            posted on 2012-06-13 10:08 Richard Wei 閱讀(3384) 評論(5)  編輯 收藏 引用 所屬分類: 設計模式

            FeedBack:
            # re: 軟命令接口的適用場合
            2012-06-13 11:21 | 華夏之火
            在這種軟命令下,只能給對象發送消息,對象可以采取種種方式響應消息,甚至可在對象外面響應消息,在外面截取消息,不讓消息流進到之前的消息處理中。這樣,就不會存在什么復雜類層次結構。這種方式,在下認為并不是“單一入口的Faced模式”,而是幾乎包含了所有接口的變種橋接模式  回復  更多評論
              
            # re: 軟命令接口的適用場合
            2012-06-13 13:29 | Richard Wei
            @華夏之火
            這個怎么說呢,Faced模式強調的是一個復雜系統對外有一個統一的入口; Bridge模式強調的是分層的概念,將抽象層和實現層分離,二層可以分別獨立的變化。感覺上面的"軟命令"方式,從對外暴露的接口的簡單統一性來說比較符合Faced模式;但是從內部實現來說,你要理解成同一消息可以有多種處理方式,Bridge模式也可以。
              回復  更多評論
              
            # re: 軟命令接口的適用場合[未登錄]
            2012-06-13 21:04 | jacky
            Faced模式是什么模式,沒聽說過啊,應該是facade吧  回復  更多評論
              
            # re: 軟命令接口的適用場合
            2012-06-13 21:08 | Richard Wei
            @jacky
            確實應該是facade, 只留意大概讀音,沒想到拼寫錯誤。
            多謝指正。  回復  更多評論
              
            # re: 軟命令接口的適用場合
            2012-06-22 01:34 | tb
            多些指教了   回復  更多評論
              
            91精品国产高清久久久久久国产嫩草 | 久久久久亚洲精品无码蜜桃| 性做久久久久久久| 996久久国产精品线观看| 久久99国产精品久久久| 久久久久亚洲AV无码去区首| 亚洲精品无码成人片久久| 热久久这里只有精品| 手机看片久久高清国产日韩| 精品久久久无码人妻中文字幕豆芽 | 久久香蕉超碰97国产精品| 久久播电影网| www.久久热| 色婷婷综合久久久中文字幕| 色播久久人人爽人人爽人人片aV| 人妻无码αv中文字幕久久| 久久性生大片免费观看性| 久久国产精品成人影院| A级毛片无码久久精品免费| 久久精品成人| 亚洲国产精品久久久久网站| 久久精品中文闷骚内射| 亚洲欧美日韩久久精品第一区| 精品久久国产一区二区三区香蕉| 国产午夜福利精品久久2021| 丁香色欲久久久久久综合网| 四虎久久影院| 久久久久久久综合狠狠综合| 理论片午午伦夜理片久久 | 久久天堂AV综合合色蜜桃网 | 久久久久无码精品国产| 97精品伊人久久久大香线蕉| 久久福利资源国产精品999| 久久影视综合亚洲| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品国产99国产精品导航 | 久久久中文字幕日本| 一本久久a久久精品综合香蕉| 老司机午夜网站国内精品久久久久久久久| 一本大道加勒比久久综合| 久久精品18|