''' 在书城的业务背景中,组合模式(Composite Pattern)可以用于构建树形结构,比如书籍的分类结构。 每个分类可以包含子分类,也可以包含具体的书籍。通过这种方式,可以方便地管理和遍历整个书籍分类体系。 下面是一个简单的实现代码示例,展示如何使用组合模式来构建书城的书籍分类结构 ''' from abc import ABC, abstractmethod # 组件抽象类 class BookComponent(ABC): @abstractmethod def add(self, component): pass @abstractmethod def remove(self, component): pass @abstractmethod def display(self, depth): pass # 叶子节点:书籍类 class Book(BookComponent): def __init__(self, title, author): self.title = title self.author = author def add(self, component): print("Cannot add to a leaf node") def remove(self, component): print("Cannot remove from a leaf node") def display(self, depth): print("-" * depth + f" {self.title} by {self.author}") # 复合节点:书籍分类类 class BookCategory(BookComponent): def __init__(self, name): self.name = name self.children = [] def add(self, component): self.children.append(component) def remove(self, component): self.children.remove(component) def display(self, depth): print("-" * depth + self.name) for child in self.children: child.display(depth + 1) # 客户端代码 if __name__ == "__main__": # 创建书籍分类和书籍对象 fiction = BookCategory("Fiction") non_fiction = BookCategory("Non-Fiction") novel = Book("The Great Gatsby", "F. Scott Fitzgerald") biography = Book("Steve Jobs", "Walter Isaacson") programming = Book("Clean Code", "Robert C. Martin") # 构建书籍分类结构 fiction.add(novel) non_fiction.add(biography) non_fiction.add(programming) # 创建一个根分类,并将其他分类添加到其中 root = BookCategory("Root") root.add(fiction) root.add(non_fiction) # 显示整个书籍分类结构 root.display(0) ''' 在这个示例中,BookComponent 是一个抽象类,定义了所有组件(无论是分类还是书籍)都应该有的方法:add、remove 和 display。 Book 类是叶子节点,代表具体的书籍,它实现了 BookComponent 接口, 但 add 和 remove 方法对于书籍来说是不适用的,因此它们只是打印一条错误消息。 BookCategory 类是复合节点,代表书籍的分类,它可以包含其他分类或书籍,因此它实现了 add 和 remove 方法来管理子节点,并且实现了 display 方法来显示分类及其子节点的信息。 客户端代码创建了一些书籍和分类对象,并构建了一个书籍分类结构。最后,通过调用根分类的 display 方法,可以显示整个书籍分类结构。 '''