封裝是實現良好模組化的關鍵,它讓模組不需知道系統其他部分,減少系統變化時要修改的地方。

Hide Delegate

除了常見的封裝欄位,我們也可用某物件(Department)封裝另個物件(Manager)。
這樣當 Manager 被修改時,對應修改只會延伸到 Department 為止。

flowchart LR
    subgraph before ["❌ 暴露委託"]
        direction LR
        C1[Client] --> E1[Employee]
        E1 --> D1[Department]
        D1 --> M1[Manager]
    end

    subgraph after ["✅ 隱藏委託"]
        direction LR
        C2[Client] --> E2[Employee]
        E2 -.->|getManager| D2[Department]
        D2 -.-> M2[Manager]
    end

    before --> after

Hide Delegate — delegation model

# Before
class Department:
    def __init__(self, manager):
        self.manager = manager

class Employee:
    def __init__(self, name, department):
        self.name = name
        self.department = department

department = Department("Alice")
employee = Employee("Bob", department)
print(f"Manager: {employee.department.manager}")

# After
class Department:
    def __init__(self, manager):
        self.manager = manager

    def get_manager(self):
        return self.manager

class Employee:
    def __init__(self, name, department):
        self.name = name
        self.department = department

    def get_manager(self):
        return self.department.get_manager()

department = Department("Alice")
employee = Employee("Bob", department)
print(f"Manager: {employee.get_manager()}")