面向机器学习工程师的 Python 设计模式:Observer

Photo by 杰森梁 on 不飞溅

面向机器学习工程师的 Python 设计模式:Observer

了解如何通过采用设计模式来构建代码:基于 Instagram 的示例

介绍

模式描述了一个经常出现的问题并提出
在类/对象组织方面可能的解决方案
一般认为可以有效地解决问题本身。
设计模式具有四个主要元素:

  • 姓名: 助记符参考,使我们能够用一两个词识别问题和解决方案。
  • 问题: 模式旨在提供解决方案的问题和上下文的描述。
  • 解决方案: 描述了构成
    解决方案以及它们之间的关系。
  • 结果: 指定应用所提议的解决方案可能带来的后果。

有几类设计模式,但已经确定了两个主要标准:

模式指的是什么:

  • 对象 : 可以改变的对象之间的关系
    执行。
  • 课程 :关注类和子类之间的关系。

模式的作用(目的):

  • 创造的 : 涉及创建对象的过程。
  • 结构 : 涉及类和对象的组成。
  • 行为的 : 定义类和对象如何交互和
    在他们之间分配责任。

但是存在多少设计模式呢?在下图中,您将看到根据其范围和目的在表格中结构化的设计模式列表。在接下来的文章中,我们将介绍最常见的设计模式。

Design Patterns (Image by Author)

如何定义设计模式?

设计模式由一些描述和促进其使用的基本属性定义。这些属性是:

  • 结构 :通过UML的图形表示所涉及的类和
    他们的关系。 (1) 参与者 :参与模式的类,它们的关系和职责。 (2) 合作 :各个班级如何协作以实现目标。
  • 结果 :使用该模式的优缺点以及使用该模式可能产生的副作用。
  • 执行 : 实施的技术和建议
    还参考特定的编程语言。
  • 示例源代码 : 提供的代码片段
    实施指南。
  • 已知用途 :在现有系统中的使用示例。
  • 相关模式 :与其他模式的差异和最重要的关系。

观察者

在我看来,理解如何定义设计模式的最简单方法是通过展示一个示例,让我们从观察者设计模式开始!

假设你是一个足球迷,你最喜欢的球员是克里斯蒂亚诺·罗纳尔多。您非常热情,想要了解有关该玩家的每条新闻和更新,因此您决定在 Instagram 上关注他。
现在您关注克里斯蒂亚诺·罗纳尔多,每次他在 Instagram 上发布帖子或采取行动时,您都会收到通知,并且所有内容都会出现在您的提要中。
在这个模式中,我们有两个演员,你是 观察者 而克里斯蒂亚诺·罗纳尔多是 主题 .

但是你会很容易理解,这不可能是一对一的关系。 克里斯蒂亚诺·罗纳尔多 是 Instagram 上最受关注的帐户之一,迄今为止大约有 4.82亿关注者 .这会让你明白 一个主题可以有多个观察者 ,所有人都对他的更新感兴趣。所以 关系 必须是 一对多 类型。

Subject-Observer relationship (Image by Author)

类图

在向您展示如何在 Python 中实现这种设计模式之前,我先为您提供一张带有类图的图像,以便您了解类之间的关系以及需要应用的方法。

Class Diagram (Image by Author)

  • Observer 和 Subject 是接口
  • 所有需要数据的观察者都需要实现 Observer 接口。
  • notify() 方法定义了当主体提供其数据时要采取的行动。
  • 主题维护一个名为“observers”的观察集合,它是当前注册的观察者的列表。
  • registerObserver() 和 unregisterObserver() 分别是添加和删除观察者的方法。
  • 当数据改变并且需要为观察者提供新数据时调用 notifyObservers()。

让我们编码吧!

首先,我们创建抽象类 Observer 和 Subject。在 Python 中创建抽象类必须继承 ABC。
观察者将有一个 update() 抽象方法,一旦他关注的 VIP 帐户发布了新内容,该方法就会通知他。
而Subject,即拥有这么多粉丝的VIP,有3个抽象功能,一个是注册一个新用户,一个是删除他,另一个(最重要的)是通知他的所有粉丝他创建了一个新帖子.

现在我们创建 InstaVIP 类,即负责实例化我们的 VIP(例如 Cristiano Ronaldo)的类。
请注意,notifyObserver 滚动浏览保存在名为observers_collection 的列表中的所有VIP 关注者以通知他们。

现在我们开发Follower类,也就是我们的观察者类。每个观察者都由一个用户名定义。在这个类中,我们应该定义每当 VIP 发布内容时都会调用的 update() 方法。理想情况下,此方法将更新我们的 Instagram 提要,但在这种情况下,它只会简单打印 VIP 发布了新内容的事实。

现在我们主要创建两个 Instagram 帐户: @theRealAccount1 @account2官方 .然后我们实例化我们的 VIP Cristiano Ronaldo。
主题必须注册我们的关注,这发生在两个账户在罗纳尔多的 Instagram 账户中点击“关注”时。
现在 Ronaldo 将使用 newPost() 方法创建一个新帖子。

在C罗的新帖生成时,会调用两个账号的更新方法,实际上会打印:

 创建了新帖子  
 @theRealAccount1 的通知:罗纳尔多创建的新帖子 @account2Official 的通知:罗纳尔多创建的新帖子

最后的想法

设计模式描述了一个经常出现的问题并提出
就类/对象组织而言,一种可能的解决方案通常被认为可以有效地解决问题本身。在各种各样的应用程序中,我们发现了相同的问题,即需要在主题更改其数据时立即通知(例如,see 发布了某些内容),而正确应用这种设计模式可以使我们的生活更轻松!
在以后的文章中,我将讨论机器学习工程师需要了解的其他设计模式,以便能够编写干净的结构化代码。

结束

马塞洛·波利蒂

领英 , 推特 , 简历

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39512/00482614

posted @ 2022-09-26 14:03  哈哈哈来了啊啊啊  阅读(95)  评论(0编辑  收藏  举报