• 技术文章 >php教程 >php手册

    PHP设计模式之观察者模式实例,php设计模式观察者

    2016-06-13 08:45:45原创798

    PHP设计模式之观察者模式实例,php设计模式观察者


    首先了解观察者模式的概念:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。观察者模式是一种事件系统,意味着这一模式允许某个类观察另一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式为您提供了避免组件之间紧密耦。

    UML结构图:

    观察者模式解决的问题

    在我们的开发过程中,应该都或多或少的碰到过改动其中一部分代码会引起其他一连串改变的问题,显然想要完全避免这种情况不太可能,但我们也应答尽量减少对其他组件的依赖,而观察者模式就是为了解决这个问题。

    举个例子来说,我们有一个帖子对象,代码如下:

    class Post
    {
    protected $_userid = null;
    protected $_ip = null;
    protected $_content = null;
    function __construct()
    {
    // ...
    }
    // 发帖方法
    public function addPost()
    {
    // ... 发帖逻辑
    }
    }

    在上面是一个普通的帖子对象,随着发帖量和访问量越来越大,运营们开始不干了,公司也经常会接到投诉电话,说我们的网站有许多敏感内容和垃圾广告,因此我们需要做内容审核:首先是对用户的审核,一些黑名单用户应该被禁止发帖;二是对IP的审核;三是对内容敏感词的审核。因此我们的代码就成了如下的样子:

    class Post
    {
    protected $_userid = null;
    protected $_ip = null;
    protected $_content = null;
    function __construct()
    {
    }
    public function addPost()
    {
    if (!Postscan::checkUserid($tihs->_userid)) {
    return false;
    }
    if (!Postscan::ipUserid($tihs->_ip)) {
    return false;
    }
    if (!Postscan::checkContent($tihs->_content)) {
    return false;
    }
    // ... 
    }
    }

    随着需要审核的字段越来越多,addPost方法变得越来越长,发布对象被也只能紧紧的被嵌入到该系统中。

    观察者模式的实现

    观察者模式的核心是把观察者从主体中分离开来,当主体知道事件发生时,观察需要被通知到,同时我们也不想把主体和观察者之间的关系写死,于是我们来修改下我们上面的代码:

    //主体必须实现的接口
    interface Observable {
    public function attach(Observer $observer);
    public function detach(Observer $observer);
    public function notify();
    }
    //观察者必须实现的接口
    interface Observer {
    public function do(Observable $subject);
    }
    class Post implements Observable
    {
    protected $_userid = null;
    protected $_ip = null;
    protected $_content = null;
    protected $_observerlist = array();
    function __construct()
    {
    }
    public function attach(Observer $observer)
    {
    $this->_observerlist[] = $observer;
    }
    public function detach(Observer $observer)
    {
    foreach ($this->_observerlist as $key => $value) {
    if ($observer === $value) {
    unset($this->_observerlist[$key])
    }
    }
    }
    public function notify()
    {
    foreach ($this->_observerlist as $value) {
    if (!$value->do($this)) {
    return false;
    }
    }
    return true;
    }
    public function addPost()
    {
    if (!$this->notify()) {
    return false;
    }
    // ... 
    }
    }

    通过上面的代码,我们可以再很容易的加入审核规则。

    SPL代码

    观察者模式是一个很常见和常用的设计模式,以至于SPL扩展已经为我们封装好了对应的类和方法,下面的代码是根据SPL提供的3个元素:SplObserver,SplSubject,SplObjectStorage来实现的代码

    class Post implements SplSubject
    {
    protected $_userid = null;
    protected $_ip = null;
    protected $_content = null;
    protected $_storage = new SplObjectStorage();
    function __construct()
    {
    }
    public function attach(SplObject $observer)
    {
    $this->_storage->attach($observer);
    }
    public function detach(SplObject $observer)
    {
    $this->_storage->detach($observer);
    }
    public function notify()
    {
    foreach ($this->_storage as $value) {
    if (!$value->update($this)) {
    return false;
    }
    }
    return true;
    }
    public function addPost()
    {
    if (!$this->notify()) {
    return false;
    }
    // ... 
    }
    }

    很简单吧,最重要的是理解,在这个例子中,我们把一些审核的方法从帖子类中剥离了开来,而且该帖子对象也可以用来作为其他的发布类型。

    以上内容实现是小编给大家介绍的PHP设计模式之观察者模式,希望对大家有所帮助!

    您可能感兴趣的文章:

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 观察者 模式
    上一篇:分割gbk中文出现乱码的问题解决,分割gbk中文乱码 下一篇:PHP内置Web Server探究(二)自定义PHP控制台输出console函数,webconsole
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• CodeIgniter安全相关设置汇总• php中文转拼音的代码• PHP数组排序函数使用方法• Java和PHP在Web开发方面的比较• 谈汉字转换类型及解决方案
    1/1

    PHP中文网