軟命令介面的適用場合
看到有些朋友很喜歡用軟命令的方式來提供介面, 什麼是軟命令, 其實就是一個介面,根據引數的不同,可以實現N多的功能(我不知道"軟命令"這名詞是我原創還是現有的,我們暫時就這樣稱呼吧).
看看現實中有哪些產品已經成功應用了這種特性?
首先想到是的是windows視窗的訊息處理函式,用C的方式是類似這樣:
LRESULT MessageProc(HWND hWnd, UINT nMsgType, WPARAM wParam, LPARAM lParam);
用C++實現是類似這樣
class CWindow
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模式就是為此而準備的,這裡就不多說了。
相關文章
- 索引設計(組合索引適用場景)索引
- 輪換代理介紹及適用場景介紹
- git命令使用(適合新手)Git
- 什麼場景適合mongodbMongoDB
- TokuDB的優缺點和適用場景介紹
- 各種程式語言的適用場合-來自知乎
- 兩款超好用的影片翻譯軟體,適合兩種不同場景,必有一款適合你
- 5個非常良心好用的軟體工具,適合各種場景
- Spark適用於哪些場景?不適用於哪些場景?Spark
- Disruptor適合這種場景嗎
- Sql最佳化(二十) 繫結變數用法、適用場合SQL變數
- 什麼業務場景適合使用Redis?Redis
- 滲透測試工具多個應用場合介紹
- CDN適用哪些場景?
- win10用什麼防毒軟體好_適合win10的防毒軟體Win10防毒
- CDN網路加速適合那些場景使用?
- 傳統的 Linux 軟體包格式不適合現代應用Linux
- INDEX SKIP SCAN適用場景Index
- 軟體開發:合適的才是最好的
- 淺談聚合介面的應用場景
- 有麼有適合職場辦公人士用的思維導圖軟體?
- .選用適合的ORACLE優化器Oracle優化
- Angular forRoot 方法的使用場合介紹Angular
- Streaming特性和適用場景
- 設計模式適用場景整理設計模式
- SPM適用的場景和示例
- 哪些人適合學軟體測試呢
- 哪些人適合學習軟體測試
- 三步選擇適合的CRM軟體
- 阿里雲伺服器ECS適合哪些場景?阿里伺服器
- 解讀:在什麼業務場景適合使用Redis?Redis
- 淺談日本伺服器適合的使用場景伺服器
- 最適合使用RxJava處理的四種場景RxJava
- 單體應用 適合採用 dapr 構建嗎?
- 適用於所有頁面的基礎樣式base.cssCSS
- 光纖跳線介面的種類及適用範圍
- [譯] 介紹適用於 iOS 的 AloeStackViewiOSView
- 企業雲盤適用哪些應用場景