【问题标题】:OOP web application class designOOP Web 应用类设计
【发布时间】:2013-03-18 10:17:03
【问题描述】:

我正在尝试使用 OOP 构建一个 Web 应用程序。

在我的应用程序中,我有课程和订阅者。 每个课程可以有多个订阅者(1-N 关系)。 现在我需要对课程执行一些操作(检查一些过期日期并对其订阅者执行操作,向管理员发送一些电子邮件),并且在执行完这些操作后,对每个订阅者执行其他操作(发送电子邮件)。

我创建了一个 Course 类和一个 Subscriber 类。 课程类包含课程数据,如标题、日期、当前状态和一组订阅者对象(参与它的人)。 订阅者类包含姓名、姓氏、订阅状态等。

我有问题。 我的课程类需要知道它的订阅者。

我的订阅者类需要了解它所属的课程(以提取标题、日期等数据)并了解订阅者的数量及其状态。

如何重新设计我的班级结构来解决这个问题? 我正在考虑使用某种观察者模式...

PS。我正在使用 PHP

【问题讨论】:

    标签: oop class design-patterns


    【解决方案1】:

    不需要特殊的设计模式,这是正常的双向关联。我从您的描述中得知,任何订阅者只订阅一门课程,否则应该有两个课程 StudentCourseSubscription 代替。

    如何在 PHP 中简单地构造关联:

    class Course
    {
        /**
         * @var Subscriber[]
         */
        protected $subscribers = array();
    
        public function addSubscriber(Subscriber $subscriber)
        {
            $this->subscribers[] = $subscriber;
        }
    }
    
    class Subscriber
    {
        /**
         * @var Course
         */
        protected $course;
    
        public function __construct(Course $course, $name, ...)
        {
            $this->course = $course;
            $course->addSubscriber($this);
            $this->name = $name;
            ...
        }
    }
    

    订阅者对象只能与课程一起存在,因此您将课程作为参数传递给构造函数。新创建的订阅者在那里注册课程。

    【讨论】:

      【解决方案2】:

      这听起来像observer pattern,直到你说的那一点

      并了解订阅者的数量及其状态。

      你需要一个观察者模式的版本,它暴露了观察者的有限信息。

      这一点类似于课程的每个订阅者,您需要从课程对象中获取所有订阅者,以便您可以在课程对象中创建一个方法,该方法将为您提供课程每个订阅者的有限信息。

      【讨论】:

      • 你是对的。这就是阻止我使用这种模式的原因。
      • @Stefano :您应该通过编写一个函数来对课程对象进行封装,该函数将公开每个对象的有限信息,对于其余问题,您可以使用观察者模式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2016-10-29
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多