欢迎光临散文网 会员登陆 & 注册

一分钟了解composite pattern

2023-04-23 21:19 作者:bibnoifasdfadf  | 我要投稿

Composite Pattern 是一个在 Python 中使用广泛的设计模式。它允许你将对象组合成树形结构,以表示部分整体的层次结构。这个模式使得客户端能够统一处理单个对象和组合对象。

 下面我们会用实例来详细说明这个模式。

 在这个例子中,我们假设有一家服装店,卖衬衫、裤子和鞋子。每个产品都有一个名称和价格。我们需要设计一个程序来计算一组产品的总价格。这些产品可以是单个产品,也可以是包含其他产品的组合产品。

 首先,我们定义一个抽象基类 Product,它有两个方法 get_name() 和 get_price()。这个类会被所有产品类继承。

from abc import ABC, abstractmethod

 class Product(ABC):

    @abstractmethod

    def get_name(self):

        pass

     @abstractmethod

    def get_price(self):

        pass

然后我们定义三个具体产品类,分别是 Shirt、Pants 和 Shoes。每个产品都有自己的名称和价格。

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

接下来,我们定义一个组合产品类 ComboProduct,它是一个包含多个产品的组合产品。它有一个名称和一个价格,以及一个产品列表。这个类同时也是一个产品,因此它继承了 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)

最后,我们来测试这个程序。我们创建了两个产品实例 Shirt 和 Pants,以及一个组合产品实例 ShirtPantsCombo,它包含了这两个产品。然后我们将这些产品加入到另一个组合产品实例 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,也就是三个产品的价格之和。

 这个例子中,我们使用 Composite Pattern 将单个产品和组合产品统一处理,使得客户端代码更加简洁和易于扩展。如果我们要增加更多的产品或组合产品,我们只需要继承 Product 类并实现 get_name() 和 get_price() 方法即可。


一分钟了解composite pattern的评论 (共 条)

分享到微博请遵守国家法律