首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

面向對象編程本質深度解析:從過程式到大師級設計的四階段演進

     編輯:關於C語言

核心理解

面向對象編程(OOP)本質可歸納為兩點:
① 封裝共性:將共同屬性與行為抽象為類
② 接口與實現分離:依賴抽象而非具體
一句話總結:「用一個類去實例化各種各樣的對象」。

四階段代碼演進(以打印作業系統信息為例)

階段一:初始版——硬編碼判斷

if (osName.equals("SunOS") || osName.equals("Linux")) ...
else if (osName.equals("Windows NT") || osName.equals("Windows 95")) ...

問題:邏輯耦合、擴展需修改核心代碼、違反開閉原則。

階段二:過程化版——函數抽取

private static String unixBox() { return "..."; }
private static String getTheString(String osName) { ... switch邏輯 ... }

改進:邏輯模塊化,但仍是集中式條件分發,新增 OS 仍需修改分發函數。

階段三:幼稚 OOP——工廠+多態

interface BoxSpecifier { String getStatement(); }
class UNIXBox implements BoxSpecifier { ... }
class WindowsBox implements BoxSpecifier { ... }
class OSDiscriminator {  // 工廠
    static BoxSpecifier getBoxSpecifier() { ... if-else 創建具體類 ... }
}

缺陷:工廠類仍包含所有具體類知識,新增類需修改工廠,類爆炸(每個 OS 一個文件),違反依賴倒置。

階段四:大師級設計——註冊表模式+單例

class OSDiscriminator {
    static Map storage = new HashMap<>();
    static BoxSpecifier getBoxSpecifier() {
        BoxSpecifier v = storage.get(System.getProperty("os.name"));
        return v != null ? v : DefaultBox.value;
    }
    static void register(String key, BoxSpecifier v) { storage.put(key, v); }
    static { WindowsBox.register(); UNIXBox.register(); MacBox.register(); }
}
class UNIXBox implements BoxSpecifier {
    static final UNIXBox value = new UNIXBox();  // 單例
    static void register() {
        OSDiscriminator.register("SunOS", value);
        OSDiscriminator.register("Linux", value);
    }
}

亮點:

  • 具體類主動註冊自身,工廠零依賴具體類
  • 新增 OS 僅需新類實現註冊,完全開閉
  • 單例模式避免重複創建
  • HashMap 查找 O(1),效率優於 if-else 鏈

反思與建議

「越來越難看懂」是過度設計的信號。
OOP 服務於變化管理,而非炫技。
原則:簡單場景用 if-else/switch;預期頻繁擴展、多維度變化時,再引入多態+註冊表。
合理使用 > 濫用模式。

文章來源:酷殼《如何理解面向對象編程》

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved