OOP 的四大支柱:如何設計一間咖啡廳的結帳系統?

2026年8月10日 凌晨12:43 · 閱讀 7 分鐘

系列文章: 常用設計模式整理 (第 2 篇)

為什麼要使用 OOP?

「物件導向」強調的是「分工合作」。比起一個人想好要如何經營一家咖啡廳,不如想好你需要什麼樣的咖啡師、管理人員、室內設計師、行銷人員,再讓大家一起合作,想來會容易得多。

OOP 讓每個人(物件)可以專注在自己的工作上,透過團體(多個物件)合作達成目標。咖啡師不需要知道行銷人員為什麼今天要推出買一送一,他只要專心於沖泡出眼前的一杯(或兩杯)好咖啡就好。

OOP 與 Design Patterns 的關係

OOP 讓我們能將不同職責分配給不同的物件,而 Design Pattern 則是進一步,將物件之間「好用的分工方式」記錄下來。每種設計模式都有適合的使用情境,讓開發者在未來遇到類似的情境時就可以直接拿來抄答案參考。

OOP 的強大之處可從其四大支柱來理解:Encapsulation, Abstraction, Inheritance, Polymorphism。Design Patterns 奠基於 OOP 之上,未來在認識各種 Design Patterns 時,也可回過頭來用四大支柱的觀點去分析各個設計模式的優點是什麼。


系統需求:一間咖啡廳的結帳系統

  • 支援多種支付方式:信用卡(Visa、Mastercard)、Line Pay、Apple Pay
  • 每筆交易需要經過驗證(額度 / 餘額是否足夠)
  • 敏感資料(卡號、餘額)不能被外部程式任意讀取或竄改
  • 結帳系統只在乎付款成功與否(遵守流程:「建立訂單 → 呼叫付款 → 顯示結果」),不在乎實際上是用哪種方式付款

你會想怎麼設計這個系統呢?可以先自己想看看,再往下看利用 OOP 四大支柱的視角會是如何進行實作


1. Encapsulation 封裝

隱藏內部細節,同時能防止外部破壞,保護資料完整性

實作:Line Pay 的驗證與資料保密

2. Abstraction 抽象

呼叫端只關注物件「能做什麼」,而不必知道是怎麼做到的,降低認知負載

實作 — 介面:將付款功能寫成一個介面
實作 — 呼叫端:結帳系統只要知道怎麼操作「付款功能」,不管細節
  • 結帳系統 Checkout 只要知道能透過介面執行 pay() 就好
  • 解耦:呼叫端只跟「契約」互動,完全不知道實作端如何完成 pay() 這件事
實作 — 實作端:實際的付款平台,負責提供符合規定的付款功能

3. Inheritance 繼承

有些類別之間會是 is-a 的關係,利用繼承將通用的邏輯寫在父類別中,達成 reuse集中管理

實作 — 父類別:兩種信用卡邏輯重複,那就寫在同個地方
實作 — 子類別:兩種信用卡邏輯不同,那就寫在自己內部

4. Polymorphism 多型

呼叫端使用同份程式碼,便能執行不同的具體實作。未來擴充新類別時也不用修改呼叫端程式碼

實作:結帳時,程式碼不需要根據結帳方式而改變

系統類別圖 Class Diagram

Class Diagram

(各語言實現 OOP 的方式略有不同,此系列的類別圖將以 java 為例來繪製)


OOP 語法整理

三種語言的設計哲學:靜態與動態
  • C++:預設是 static binding,意思是方法呼叫與實際執行的程式碼預設在編譯期就決定好。若要支援 dynamic binding,則必須透過 virtual 關鍵字來讓 compiler 知道這個方法呼叫要等到執行期再做決定
  • Java:預設是 dynamic binding,故所有 instance methods 呼叫都是執行期才動態決定,只有 static method 是靜態綁定
  • Python:為直譯語言,不需要編譯。不只方法呼叫時執行的內容,連變數本身的型別也是動態決定。呼叫方法時預設不會檢查類別,只要有對應的方法就可以合法執行呼叫,也就是 duck typing 機制 —— 只要叫聲像是鴨子,就算它實際是台音響 Python 也當作它是隻鴨子 —— 佛系的語言 :)
三種語言的設計哲學:多重繼承的不同策略
  • C++:支援多重繼承,但要透過 virtual inheritance 自行解決 diamond inheritance 問題
  • Java:只能單一繼承(extends),但可以實作(implements)多個 interfaces。因為 interface 沒有 field,也沒有方法實作(除非主動定義 default methods),故不會有 diamond inheritance 問題
  • Python:支援多重繼承,用 MRO 解決 diamond inheritance 問題

本文採用 CC BY-NC 4.0 授權條款,轉載請註明出處。