面向对象has-a关系中从属对象调用所有者类方法的实现问题
一对多关系下的书籍读取状态联动实现方案
单本读取时同步触发Library回调的实现
要让Book.isRead()被调用时同步触发Library.newBookRead(),核心是让Book实例在自身读取状态变更时,主动向所属的Library实例发送通知,最直接的实现是在Book初始化时绑定所属的Library引用,没有额外性能开销,触发逻辑完全同步。
示例代码(以Python为例,其他语言逻辑一致):
class Book: def __init__(self, title, owner_library): self.title = title self._owner_lib = owner_library # 持有所属图书馆的引用 self._has_read = False # 自身已读状态标记,避免重复触发 def isRead(self): # 已经读过的书不重复触发通知 if self._has_read: return self._has_read = True # 同步调用图书馆的单本读取回调 self._owner_lib.newBookRead(self)
如果需要完全解耦Book和Library的直接依赖,可以抽象一个通用的ReadEventListener接口,Library实现这个接口,Book只持有接口类型的监听者引用即可,后续如果有其他需要监听书籍读取事件的对象,也可以直接注册到Book上,扩展性更强。
全馆书籍读完的判定逻辑
Library侧只需要维护两个核心状态,就能准确判定所有书籍是否读完:
- 馆藏书籍的总数量/总集合
- 已完成读取的书籍计数/已读书籍集合
每次newBookRead()被触发时,先更新已读计数,再校验已读数量是否等于总馆藏数量,条件满足时直接调用libraryRead()即可。
对应Library类的示例代码:
class Library: def __init__(self): self._total_books = [] # 全量馆藏 self._read_count = 0 # 已读书籍计数 def addBook(self, book): # 新增馆藏时同步维护总数量 self._total_books.append(book) def newBookRead(self, book): self._read_count += 1 # 可在这里添加单本读完的业务逻辑 print(f"已完成书籍《{book.title}》的读取登记,当前进度{self._read_count}/{len(self._total_books)}") # 校验是否全部读完 if self._read_count == len(self._total_books): self.libraryRead() def libraryRead(self): # 所有书读完后的业务逻辑 print("全部馆藏书籍已读取完成,触发全馆读完回调")
注意事项
- Book类必须加重复读取的状态拦截,否则同一本书多次调用
isRead()会导致计数重复累加,最终判定逻辑失效 - 如果存在动态增删馆藏的场景,需要同步维护计数:比如删除一本已读书籍时,要对应把
_read_count减1;新增一本已读书籍时,要对应把_read_count加1,避免统计偏差 - 上述实现是完全同步的,
isRead()执行完成前,newBookRead()和满足条件时的libraryRead()都会执行完毕,不存在异步时序问题
内容的提问来源于stack exchange,提问作者lstewart
相关产品推荐
相关产品推荐

