PHP设计模式(十四)之PHP详细记录实现观察者模式代码篇

作者: 温新

分类: 【设计模式】

阅读: 2045

时间: 2020-05-01 16:37:22

Subject.php

<?php

/**
 * Interface Subject 抽象主题
 *
 * 解释:抽象主题可以当成全通同学商量后规定监视老师的那个同学一定要实现的方法,
 * 相当于监视前的约束。
 *
 * 换而言之,全班同学对那个监视(也就是主题)的同学说,
 * 你去监视老师,怎么监视老师呢?我们一起共同商量了有下面几个方法
 */
interface Subject
{
    // 添加观察者
    public function attach(Observer $observer);

    // 删除观察者
    public function detach(Observer $observer);

    // 通知
    public function notify($msg = '');
}

ConcreateSubject.php

<?php

/**
 * Class ConcreateSubject 具体主题,张三开始到教室门口监视老师
 *
 * 张三有这些方法可以用,添加观察者,删除观察者,通知观察者
 * A同学想要张三及时告诉他老师有没有来的信息,于是A同学就到张三这里登录
 * 张三使用attach登记后,就知道A同学想要知道老师来没来的信息
 *
 * ......
 */
class ConcreateSubject implements Subject
{
    // 存储观察者对象的数组
    private $_observer = [];

    // 添加观察者
    public function attach(Observer $observer)
    {
        $this->_observer[] = $observer;
    }

    // 删除观察者
    public function detach(Observer $observer)
    {
        // 判断观察者是否被删除
        $key = array_search($this->_observer , $observer);
        if($key !== false){
            unset($this->_observer[$key]);
        }
    }

    // 通知所有观察者
    public function notify($msg = '')
    {
        echo '你真帅说:' . $msg . '<hr>';

        // 取出$_observer里面的同学,告诉他们老师来了
        foreach ($this->_observer as $observer) {
            // 为登记的同学发送信息,告诉他们老师来了
            $observer->update($msg);
        }
    }
}

Observer.php

<?php

/**
 * Interface Observer 抽象观察者
 *
 * 抽象观察者规定了具体接收主题发来的信息,然后及时更新
 */
interface Observer
{
    public function update($msg);
}

LiObserver.php

<?php

/**
 * Class LiObserver 具体监听者,李同学
 */
class LiObserver implements Observer
{
    public $msg = '';
    public function __construct($msg)
    {
        $this->msg = $msg;
    }

    public function update($msg)
    {
        echo $this->msg . '<br>';
    }
}

ZhangObserver.php

<?php

/**
 * Class ZhangObserver 具体监听者,张同学
 */
class ZhangObserver implements Observer
{
    public $msg = '';
    public function __construct($msg)
    {
        $this->msg = $msg;
    }

    public function update($msg)
    {
        echo $this->msg . '<br>';
    }
}

index.php

<?php

include  './Subject.php';
include  './ConcreateSubject.php';
include  './Observer.php';
include  './ZhangObserver.php';
include  './LiObserver.php';

// 实现
class index
{
    public static function idx()
    {
        $ac = new ConcreateSubject();
        $ac->attach(new ZhangObserver('我是张同学,我在假装上课'));
        $ac->attach(new LiObserver('我是李同学,我上假装认真记单词'));
        $ac->notify('老师来了');
    }
}

Index::idx();

总结:

1)设计模式理解起来确实有些烧脑,观察者模式所花费的时间不短,代码看起来简单,但是一点儿也不简单。遇到烧脑的地方,去找些设计模式的视频来看看,看了视频之后更加觉得烧脑,因为视频中很难讲清,于是关闭了视频,仍旧回到了书籍与网上的资料当中。

2)设计模式看视频很难去弄明白(这是我个人的看法),往上的视频大多数都是代码几下就实现了,但是关于设计模式的思想却没怎么说。设计模式最为重要的就是思想,只有理解了思想,代码也就实现了。

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年05月02日

请登录后再评论