2020年4月

最近在试着做一个问答系统,有个需求是记录用户的各种活动(activities)作为站点动态,传统的实现方式需要写大量重复的代码,而且可能会给后期版本迭代增加难度,为了改善这种情况,可以使用简单的观察者模式。
下面是一个简单的观察者模式示例,它实现了用户在发布问题时,通知EventLog,记录下用户的操作:

<?php

class QuestionActions{
    
    /**
     * 内部属性用来存放观察者对象
     */
    protected $_observer = null;

    /**
     * 传入观察者对象
     */
    public function notifyObserver($observer){
        $this->_observer = $observer;
    }

    /**
     * 调用观察者记录事件
     */
    public function putQuestion($user,$question){
        $this->_observer->writeLog($user,$question);
    }


}

/**
 * 定义时间记录类
 */
class EventsLog{

    public function writeLog($user,$question){
        echo "- <small><b>".$user."</b> 新增了问题:<b>“ ".$question."”</b></small><br/>";
    } 

}

$action = new QuestionActions();
$action->notifyObserver(new EventsLog());
$action->putQuestion('猪八戒','猴哥,咱们什么时候开饭啊?');

$action = new QuestionActions();
$action->notifyObserver(new EventsLog());
$action->putQuestion('沙和尚','师傅去哪了?');

$action = new QuestionActions();
$action->notifyObserver(new EventsLog());
$action->putQuestion('孙悟空','妖怪哪里逃?');

效果图:

QQ图片20200428180804.png