看到有些朋友很喜歡用軟命令的方式來(lái)提供接口, 什么是軟命令, 其實(shí)就是一個(gè)接口,根據(jù)參數(shù)的不同,可以實(shí)現(xiàn)N多的功能(我不知道"軟命令"這名詞是我原創(chuàng)還是現(xiàn)有的,我們暫時(shí)就這樣稱呼吧).
看看現(xiàn)實(shí)中有哪些產(chǎn)品已經(jīng)成功應(yīng)用了這種特性?
首先想到是的是windows窗口的消息處理函數(shù),用C的方式是類似這樣:
LRESULT MessageProc(HWND hWnd, UINT nMsgType, WPARAM wParam, LPARAM lParam);
用C++實(shí)現(xiàn)是類似這樣
class CWindow
{
public:
LRESULT MessageHander(UINT nMsgType, WPARAM wParam, LPARAM lParam);
};
當(dāng)然里面實(shí)現(xiàn)時(shí)會(huì)有一堆switch case.
接下來(lái)會(huì)想到COM里IDispatch接口的Invoke函數(shù),外部無(wú)論調(diào)用對(duì)象的什么方法或?qū)傩裕纪ㄟ^(guò)這個(gè)自動(dòng)化接口。
再往廣義上想,DOS里的命令行,Windbg的操作命令等,其實(shí)都是"軟命令"。
再?gòu)V一點(diǎn), 整個(gè)Web服務(wù)器就是一個(gè)"軟命令"入口,比如URL API,都是通過(guò)一個(gè)單獨(dú)的Http請(qǐng)求入口,可以實(shí)現(xiàn)各種各樣的任務(wù)。
我們對(duì)上面的例子進(jìn)行抽象,就會(huì)發(fā)現(xiàn)他們的共性是對(duì)外接口固定,但是內(nèi)部功能確是可以擴(kuò)充,很符合開(kāi)放封閉這條設(shè)計(jì)原則。往設(shè)計(jì)模式上考慮, 其實(shí)就是單一入口的Facade模式。
這么方便的接口,那么是不是在我們平時(shí)的設(shè)計(jì)中應(yīng)該盡量使用呢? 我看未必。 如果按照這種設(shè)計(jì),任何類都只要一個(gè)MethodCallRequest方法就好了,根據(jù)這個(gè)入口,我會(huì)根據(jù)你的命令類型,調(diào)用相應(yīng)的方法。如果你真的所有的類都這樣做了,等類層次一復(fù)雜,我看你的代碼就不用維護(hù)了。當(dāng)然也有語(yǔ)言確實(shí)是這么做的,比如Objective-c, 它內(nèi)部對(duì)象的每個(gè)函數(shù)調(diào)用,都是通過(guò)查找對(duì)象的function table, 然后再調(diào)用對(duì)應(yīng)的function,但它的前提是語(yǔ)言本身提供這個(gè)特性。但是像C++這種靜態(tài)強(qiáng)類型的語(yǔ)言,讓對(duì)象的每個(gè)方法有明確的用途,讓編譯器幫你檢測(cè)對(duì)象是不是有相應(yīng)的方法,一來(lái)清晰,而來(lái)高效,何樂(lè)而不為?
那么究竟什么時(shí)候適用這種接口方式呢?
我的看法是只有當(dāng)你的模塊是一個(gè)單獨(dú)的子系統(tǒng),當(dāng)對(duì)外提供功能時(shí),才可以這么做。這里的子系統(tǒng)不一定要是一個(gè)很大的概念,比如一個(gè)窗口,一個(gè)COM對(duì)象都可以稱為簡(jiǎn)單的子系統(tǒng),但是它的前提要求是獨(dú)立,對(duì)外,并且最好你可以預(yù)見(jiàn)到以后它的功能會(huì)改變和擴(kuò)充。
那么有沒(méi)有不用這種"軟命令"的接口方式,但是我也可以不斷擴(kuò)充對(duì)象提供的方法呢? 有的,設(shè)計(jì)模式里的Visitor模式就是為此而準(zhǔn)備的,這里就不多說(shuō)了。
posted on 2012-06-13 10:08
Richard Wei 閱讀(3369)
評(píng)論(5) 編輯 收藏 引用 所屬分類:
設(shè)計(jì)模式