# 前言 本系列的第6篇 這次是裝飾器模式(Decorator Pattern) # 裝飾器模式 一種結構型設計模式,它允許你動態地為物件添加新的行為或功能,而無需改變原始類別的定義。 核心思想是將功能封裝在不同的裝飾類別中,並通過堆疊或組合這些裝飾來靈活地擴展物件的行為。 假設我想實作某個遊戲攻擊系統 你的攻擊在一般狀況下是沒有屬性的,傷害也不高 但你可以透過其他機制為攻擊增加屬性、攻擊力,甚至是多重屬性 透過裝飾器模式就能達成此效果 ```python= from abc import ABC, abstractmethod class Weapon(ABC): @abstractmethod def damage(self) -> float: pass @abstractmethod def element_type(self) -> str: pass class Attack(Weapon): # 具體被裝飾的類別 def damage(self) -> float: return 5.0 def element_type(self) -> str | None: return None class AddOnDecorator(Weapon): # 抽象其他屬性的裝飾器類別,讓武器可附加其他屬性 def __init__(self, weapon: Weapon): self.weapon = weapon class Fire(AddOnDecorator): def damage(self) -> float: return self.weapon.damage() + 5.0 def element_type(self) -> str: if self.weapon.element_type() != None: return self.weapon.element_type() + " + Fire" return "Fire" class Ice(AddOnDecorator): def damage(self) -> float: return self.weapon.damage() + 1.5 def element_type(self) -> str: if self.weapon.element_type() != None: return self.weapon.element_type() + " + Ice" return "Ice" class Electric(AddOnDecorator): def damage(self) -> float: return self.weapon.damage() + 8.5 def element_type(self) -> str: if self.weapon.element_type() != None: return self.weapon.element_type() + " + Electric" return "Electric" if __name__ == "__main__": normal_attack = Attack() print(f"Damage: {normal_attack.damage()}; Attack Type: {normal_attack.element_type()}") fire_attack = Fire(normal_attack) print(f"Damage: {fire_attack.damage()}; Attack Type: {fire_attack.element_type()}") ice_attack = Ice(normal_attack) print(f"Damage: {ice_attack.damage()}; Attack Type: {ice_attack.element_type()}") multi_type_attack = Electric(ice_attack) print(f"Damage: {multi_type_attack.damage()}; Attack Type: {multi_type_attack.element_type()}") ``` 執行程式碼的結果為 ``` Damage: 5.0; Attack Type: None Damage: 10.0; Attack Type: Fire Damage: 6.5; Attack Type: Ice Damage: 15.0; Attack Type: Ice + Electric ``` # 心得 裝飾器模式給我的感覺非常靈活 透過組合的方式讓原先的程式碼有著不一樣的效果 範例中的程式碼其實可以再更精簡一點 不過個人認為寫成這樣,在理解裝飾器模式的設計時會更容易一點