從更高的層次來思考設計模式其實就是方法論的範疇,對於現在流行的軟體設計模式來講,對其介紹的出發點大部分都處在程式設計層面.設計模式本身屬於方法學層面,是人們在對現實世界的認知和改造過程中總結而來,因此,這些方法無論是在軟體設計還是硬體設計,甚至是其它領域的設計都是適用的,是跨學科和跨領域的方法學.
現實世界的對象之間的關係是非常複雜的,在4維空間下,對於對象之間的關係可以簡單的分為靜態關係和動態關係(這裡的4維是指三維空間+一維時間),靜態關係表達的是對象之間的位置(在4維空間下),而動態關係表達的是對象之間的相互作用(行為,通訊),今天討論的間接法就是處理對象之間動態關係的一種簡單而樸素的方法.由於對象之間的相互作用非常複雜,很多時候在對象之間的直接相互作用(通訊)非常困難(不可達,成本高昂,過於複雜),就可以在這些對象中間增加一輔助對象(第三方的,可以是自然存在的,也可以是人為增加的)來達到通訊目的,這種方法就是間接法,間接法中的第三方我們稱之為中間角色,需要注意的是這個中間角色可以是對象,也可以是"場地".間接法的情境和處理方法在現實世界中無處不在,貨幣,集市,代理人,銀行等.而且這種間接法具有多重性和相對性,多重性是指中間角色可以是橫向的多個,也可以是縱向的多個;相對性是指中間角色是相對的,比如A->B->C中,B是中間角色,但在B->C->D中B則是通訊方角色.當然,在實際系統設計中,應盡量避免多角色問題,做到對象責任盡量單一.
間接法不僅讓對象之間的作用成為可能(比如電話使得兩個距離很遠的人可以通話),還可以提供很大的靈活性並降低成本(超市,集市等).在軟體設計模式中的大多數建立型和行為型基本都屬於間接法範疇,而結構型中很多也是這種方法的體現.間接法告訴我們,如果:
A) 如果一個事情直接處理比較困難(對象間通訊);
B)如果一個對象處理能力有限(責任過多);(從方法學來說,這種更傾向於輔助法)
C)為了更加靈活和可擴充
......
我們都可以試著增加一些中間角色來輔助處理.需要注意的是如果從角色分解的角度來看,有些中間角色並不處在"中間",這也沒有關係.
1)讓作用成為可能(解決根本問題);
2)提供了靈活性和可擴充性;
在現實處理中,採用間接法時,設定中間角色相對比較簡單,但如何處理原來對象與中間對象的責任關係呢?方法就是責任重新分配,原則就是責任單一.責任單一是一種化繁為簡的方法.下面我們來看看軟體設計模式中的間接法應用:對於建立模型設計模式,其目的是為了減少消費者對象(對象使用者)的建立責任,同時將建立責任集中起來以獲得一定的控制功能,便於建立責任的增加和擴充.利用間接法,增加一個中間角色-對象工廠,專門負責產品對象的建立.在這種模式裡將相互作用的對象分為三種角色:產品,工廠和消費者.這種模式跟我們現實社會中絕大部分的產品生產和消費的處理方式是一致的.
對於代理,觀察者,命令等模式,都是間接法的典型應用.需要注意的是這些模式並不是軟體設計專用的,這些方法都是在現實生產和生活中總結出來的.
PS:寫這種文章感覺很耗腦子.