以餐館為例設計物件:前台接待員、服務員、收銀員、廚師、廚工。冒號老師將其翻譯為 Java 代碼,構建 Restaurant 類,核心 service() 方法無限循環接受顧客並服務。
單執行緒會導致服務完一位才能服務下一位。引入 Thread + Runnable 匿名類,每位顧客獨立執行緒服務。這裡用到了併發式,同時也涉及函數式——匿名類本質是函數 serve 的包裝,記住外部局部變量 customer(故需 final),是 OO 化的閉包形式。
閉包是能保留創建時環境變量的函數,通常以匿名方式存在。JavaScript 代碼示範:derivative 函數返回匿名函數,附著參數 f 與局部變量 dx。若無閉包,derivative 返回後這兩變量即失效。合理使用閉包使代碼簡潔優雅。
句號實現 serve():接待員迎客引座 → 服務員斟茶寫菜 → 廚師照單做菜 → 服務員上菜 → 顧客用餐 → 收銀員收帳開票 → 接待員送客。學員們指出漏洞:廚工未用、廚師/服務員/顧客應並行、多廚師並行、後台執行緒換盤洗碗、換盤有輪詢(主動)與通知(事件驅動)兩種方式。
大廚查食譜做菜,菜式成千上萬但烹調技法較少。將待加工菜餚視為數據、技法視為算法,分離數據與算法、以算法為中心——即泛型式編程。
服務員推薦菜式涉及口味、忌諱、菜單變化,硬編碼 if-else 會成懶婆娘裹腳布。用領域特定語言 (DSL) + 元編程,或規則語言 + 規則引擎(Jess、Drools、JLisa、JRules,基於 Rete 算法正向推理),將業務規則與應用分離、知識表示與邏輯實現分離(SoC 原理)。正向推理適合「根據輸入作出反應」,逆向推理(Prolog)適合「回答查詢」。
經理接到投訴:服務態度差、衛生不佳。若在各類方法中硬編碼禮貌用語、洗手消毒,修改極不便。建立 Etiquette、Sanitation 兩個 Aspect,運行期可激活/禁用,優雅解決橫切關注點模組化難題。
九大範式在餐館場景完美串聯:過程式、物件式、併發式、函數式、事件驅動、泛型式、元編程、邏輯式、切面式。「每種編程範式都能在生活中找到應用,它們本來就是人類思維方式的投影。」
