You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:42:29