反向溝通 (IoC : Inversion Control )
2.3 主控者是框架,而不是應用程式 2.4 現代應用框架:採取廣義 IoC 觀念
第 2 章
應用框架魅力的泉源:
反向溝通 (IoC : Inversion Control )
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
2.1 前言
2.2 認識反向溝通
2.3 主控者是框架,而不是應用程式
2.4 現代應用框架:採取廣義 IoC 觀念
2.5 框架的重要功能:提供預設行為
32 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
2.1 前言
上章裡,您已知道應用框架之目的,也瞭解它在軟體設計上之角色。本章 裡,將專注於框架之主角──抽象類別上,說明抽象類別之特性,分析「抽象」與
「具體」類別之間的雙向溝通方法。應用框架中最令人著迷之處是:
框架裡的函數,能呼叫應用程式的函數。
﹌﹌﹌﹌﹋﹌﹌﹋﹌﹌﹌﹌﹌﹋﹌﹌﹋﹋
這是框架與一般類別庫(或程式庫)的極重要區別。使用一般程式庫時,程 式中的函數呼叫了現成的庫存函數,但庫存函數不能反過來,呼叫您所寫的函 數。由於庫存函數設計在先,而您寫程式在後﹔所以,您的函數呼叫庫存函數,
這種晚輩呼叫前輩的傳統溝通情形,是您已非常熟悉的了。
應用框架除了能進行傳統溝通外,還提供新潮方法:前輩呼叫晚輩。雖然前 輩(應用框架)誕生時,晚輩(應用程式)尚未誕生﹔但是前輩有時候可預知晚 輩中的函數,就可呼叫它。這種功能,具有下述效果:
☆ 框架能事先定義許多「預設」(Default)函數。預設(default) 函數就是依 慣例而設定之函數。慣例是自動化科技的基本觀念,也是應用框架的 重要機制。例如,搭計程車時,您只要告訴計程車司機:「到士林夜 市」,司機會依照其經驗習慣而選取路線,讓您舒適抵達夜市。更重要 的是,您可特別指示司機,他會按照您(即應用程式)的意思而「修正」
其慣例。
☆ 應 用 程 式 師 的 主 要 工 作 是 : 設 計 函 數 供 框 架 來 呼 叫 。 這 些 函 數 可 修正或取代框架中的函數。
☆ 如 果 程 式 中 的 函 數 已 修 正 或 取 代 預 設 函 數 , 框 架 就 呼 叫 程 式 中 的 函數﹔反之則呼叫預設函數。
這些效果正滿足當令流行的「事件驅動」(Event-Driven)軟體的需要,如下圖 2-1 所示。
第 2 章 應用框架魅力的泉源:反向溝通 33
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
使用者
OS(Linux/Windows) 事件1 事件 2 事件 3
應用框架
預設 f1()
預設 f3()
預設 f4() abstract
f2()
應用程式
f1() f2() f4()
訊息(呼叫) 訊息 訊息
訊息 訊息 訊息 訊息
圖 2-1 應用框架與事件驅動軟體
這是在 Linux 或 Windows 等作業系統下,應用框架的典型雙向溝通情形,茲
將上述4 種呼叫情形說明如下:
1. 框架中預設了 f1(),程式中也定義了 f1()。此時優先呼叫晚輩的 f1() 函數。
2. 框架「虛」設了 f2(),亦即 f2()是個抽象(abstract)函數。此時您務必
34 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
定義 f2()來充實之,並供 Linux/Windows 或其它函數呼叫。例如 f3() 呼叫f2()。
3. 框架預設了 f3(),程式並未定義 f3()。此時呼叫預設的 f3()函數。
4. 框架預設了 f4(),您也定義了 f4()。此時優先呼叫 f4()函數,而 f4()可呼 叫前輩(預設)的f4()函數。
從上所述,您可看出重要現象:
框架與程式之間,主控權是在框架手上,您寫的函數皆供框架呼叫 ﹋﹌﹌﹌﹌﹋﹌﹌﹌﹌﹋﹌﹌﹌﹌﹋﹌﹌﹌﹌﹋﹌﹌﹌﹌﹋﹌﹌﹌﹌﹌
回想一下,您寫傳統程式時,主控權掌握在程式手中,其決定如何呼叫庫存 函數﹔就像棒球比賽的「投手」一樣。反之,使用框架時,您的程式則擔任「捕 手」之角色。盼您在使用框架時,能有這種心理準備(Mindset) 。