一分鐘了解composite pattern
Composite Pattern 是一個在 Python 中使用廣泛的設計模式。它允許你將對象組合成樹形結(jié)構(gòu),以表示部分整體的層次結(jié)構(gòu)。這個模式使得客戶端能夠統(tǒng)一處理單個對象和組合對象。
?下面我們會用實例來詳細說明這個模式。
?在這個例子中,我們假設有一家服裝店,賣襯衫、褲子和鞋子。每個產(chǎn)品都有一個名稱和價格。我們需要設計一個程序來計算一組產(chǎn)品的總價格。這些產(chǎn)品可以是單個產(chǎn)品,也可以是包含其他產(chǎn)品的組合產(chǎn)品。
?首先,我們定義一個抽象基類 Product,它有兩個方法 get_name() 和 get_price()。這個類會被所有產(chǎn)品類繼承。
from abc import ABC, abstractmethod
?class Product(ABC):
? ? @abstractmethod
? ? def get_name(self):
? ? ? ? pass
? ? ?@abstractmethod
? ? def get_price(self):
? ? ? ? pass
然后我們定義三個具體產(chǎn)品類,分別是 Shirt、Pants 和 Shoes。每個產(chǎn)品都有自己的名稱和價格。
class Shirt(Product):
? ? def __init__(self, name, price):
? ? ? ? self.name = name
? ? ? ? self.price = price
? ? ?def get_name(self):
? ? ? ? return self.name
? ? ?def get_price(self):
? ? ? ? return self.price
?class Pants(Product):
? ? def __init__(self, name, price):
? ? ? ? self.name = name
? ? ? ? self.price = price
? ? ?def get_name(self):
? ? ? ? return self.name
? ? ?def get_price(self):
? ? ? ? return self.price
?class Shoes(Product):
? ? def __init__(self, name, price):
? ? ? ? self.name = name
? ? ? ? self.price = price
? ? ?def get_name(self):
? ? ? ? return self.name
? ? ?def get_price(self):
? ? ? ? return self.price
接下來,我們定義一個組合產(chǎn)品類 ComboProduct,它是一個包含多個產(chǎn)品的組合產(chǎn)品。它有一個名稱和一個價格,以及一個產(chǎn)品列表。這個類同時也是一個產(chǎn)品,因此它繼承了 Product。
class ComboProduct(Product):
? ? def __init__(self, name, *products):
? ? ? ? self.name = name
? ? ? ? self.products = products
? ? ?def get_name(self):
? ? ? ? return self.name
? ? ?def get_price(self):
? ? ? ? return sum(product.get_price() for product in self.products)
最后,我們來測試這個程序。我們創(chuàng)建了兩個產(chǎn)品實例 Shirt 和 Pants,以及一個組合產(chǎn)品實例 ShirtPantsCombo,它包含了這兩個產(chǎn)品。然后我們將這些產(chǎn)品加入到另一個組合產(chǎn)品實例 SalesCombo,計算它們的總價格。
shirt = Shirt('Nike shirt', 100)
pants = Pants('Adidas pants', 200)
shirt_pants_combo = ComboProduct('Shirt and pants combo', shirt, pants)
?shoe = Shoes('Reebok shoes', 300)
sales_combo = ComboProduct('Sales combo', shirt_pants_combo, shoe)
?total_price = sales_combo.get_price()
?print(f'Total price of {sales_combo.get_name()}: {total_price}')
運行這個程序,我們可以看到最終的總價格為 600,也就是三個產(chǎn)品的價格之和。
?這個例子中,我們使用 Composite Pattern 將單個產(chǎn)品和組合產(chǎn)品統(tǒng)一處理,使得客戶端代碼更加簡潔和易于擴展。如果我們要增加更多的產(chǎn)品或組合產(chǎn)品,我們只需要繼承 Product 類并實現(xiàn) get_name() 和 get_price() 方法即可。