返回介绍

4.1 消息转发

发布于 2025-02-20 00:17:07 字数 1323 浏览 0 评论 0 收藏 0

我们可以做得更好,让每个对象都有一个特殊的“伙伴”对象,任何不理解的消息都自动转发给它。可以定义新的语法抽象 OBJECT-FWD 用于构造这样的对象:

(defmac (OBJECT-FWD target
                    ([field fname init] ...)
                    ([method mname args body] ...))
  #:keywords field method
  #:captures self
  (letrec ([self
            (let ([fname init] ...)
              (let ([methods (list (cons 'mname (λ args body)) ...)])
                (λ (msg . vals)
                  (let ([found (assoc msg methods)])
                    (if found
                        (apply (cdr found) vals)
                        (apply target msg vals))))))])
    self))

请注意这里语法的扩展,指定了 target 对象;只要某条消息在对象的方法中找不到,调度过程就会使用 target 对象。当然,如果所有对象都将未知消息转发给其他对象,那么传递链中必须有个最后的对象,该对象在收到消息时可以简单报错:

(define root
  (λ (msg . args)
    (error "not understood" msg)))

于是 broker 可以这样定义:

(define broker
  (OBJECT-FWD seller () ()))

这就是说, broker 是个空对象(不含字段,不含方法),只是将所有发送给它的消息转发给 seller

> (-> broker price 2)
200
> (-> broker unit)
1

这种对象通常被称为 代理 (proxy)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文