浅谈php的观察者模式-PHP

php  @amazeUI  2016-10-31 07:03:53

有时候上网查一点资料,愣是得看个半天,各种名词扑面而来,好像自己在这方面一直都是在打酱油白活了似的,其实有的时候对的往往是简单的,一目了然的,如果你查资料瞬间各种名词漫天飞舞,那你可以再多找几篇文章去看看了,百度能查到的资料百分之七十是一模一样的都是互相cv,其他百分之二十就都是抄的手册里的,还有百分之十呢是自己写的,这百分之十里面吧,又有百分之50喜欢丢名词(听说这样比较有big),还有百分之四十说得不清不楚像是生怕别人会知道了这个知识点了似的,还有百分之五说得清清楚楚简简单单,还有百分之五就是我这种,什么都不懂又喜欢瞎说误人子弟的

        PHP的主要设计模式大概是九种,其中工厂,单例,观察者模式也是用得比较多的三种模式,所有模式都围绕几个核心转着,模式让代码更优雅,更容易维护,能更好的应对需求的改变,让代码往高内聚低耦合的道路上更进一步('看项目而言,没有必要一味的追求高内聚低耦合)。

        撇开观察者模式这几个字不谈,来谈谈可能遇到的事吧,一个交友网站,你被安排写一个登录模块,很快你就写完了,过了几天,项目经理说,需要用户一登陆这条用户的信息里面的登录时间字段做一下修改,上次登录的时间这个字段也为当前时间。你三下五除二又给写完了,不就是在登录的时候操作数据库嘛。过了几天,项目经理说了,需要用户一登陆,就把我们网站的最新活动推送给用户,然后又在操作登录时间字段的代码下面又加了几行。过了几天经理又说了,用户一登陆,需要给他推送他平常最中意的对象类型,弄十个给他,看他丫的充不充会员,然后又在公司推送活动的代码块下调用别人的模块,获得这个用户的喜好,然后再写推送。经理又说了,总觉得不够活跃,要不这样,你写块代码,你就造个假,用户一登陆你就让附近的人给他打个招呼。。。。。。后续可能还有更多,这是登录模块,此时这个方法已经是一团乱麻,半个月后,再把这块代码给你看,或者让你做做修改,加加功能,改改需求什么的,你会鄙视道这哪个傻叉写得玩意啊,都啥啥啥啊这都,随便改一小块整个登录都用不了了。

      这是最蠢的写法,好一点就是做成插件的形式,每当有需求打包成一个类,一个供外部调用的方法,执行这个方法就够了,登录模块也就只有几行代码了,且不会影响上下文。还有一种办法就是利用php自带的观察者模式。回头再来看上面这段假设,可以至少得出一个结论,所有需求都是围绕着登录成功后来做的,登陆后要做很多的事情。再把距离拉远一点,可以看出只要登录成功,补分业务就要开始运行,把这些需求看作是小人,用户只要一进门,就会有人喊道有人进来了,该敲锣的敲锣该打鼓的打鼓。其实这就是观察者模式,只要被观察者作出了响应的改变,观察者们就会有相应的动作。若观察者模式以这种方式说出来,我想没有几个人会觉得晦涩难懂吧,但是缺少了big,这不是一个'程序员该有的big',这听起来也太不专业了。但是写程序就是跟生活琐事一样,要肚子饱就得吃饭,要吃饭就得煮饭,煮饭就得洗锅淘米,都是有个流程的,没必要说得有big让别人不懂。

        php提供的两个接口,一个被观察者接口SplSubject,一个或多个观察者接口SPLObserver,和一个可以储存对象的类SplObjectStorage。被观察者有三个方法,需要实现这三个方法,一个attach可以理解为添加一个观察者,detach可以理解为删除掉一个观察者,一个notify里面做循环执行被观察者的update方法(被观察者被存储在splobjectstorage类里面),update方法把本类作为参数传进去。

public $observers= null;

public function __construct()

{

$this->observers= new SplObjectStorage();//这里创建一个存储被观察者的对象

}

public function login()

{//单纯做登录操作

    $this->notify();//通知被观察者

}

public function attach(SplObserver$observer)

{

$this->observers->attach($observer);//添加进一个被观察者

}

public function detach(SplObserver$observer)

{

$this->observers->detach($observer);

}

public function notify()//在这个方法里循环调用观察者的update方法

{

$this->observers->rewind();//将内部指针指向开始处

    while ($this->observers->valid()) {

$observer= $this->observers->current();//获取当前对象

        $observer->update($this);

$this->observers->next();//将指针往下走一位

    }

}

class PushUserimplements SplObserver

{//用户推送-观察者

    public function update(SplSubject$subject)//穿进来一个被观察者

    {//写自己的业务逻辑

    }

}

class PushNewsimplements SplObserver

{//新闻推送-观察者

    public function update(SplSubject$subject)

{//写自己的业务逻辑

    }

}

$user= new Login();//创建一个实现了被观察者的接口类

$user->attach(new PushNews());//传进去一个实现了观察者的接口类

$user->attach(new PushUser());

$user->login();

//执行完自己的登录逻辑后,会调用自身的notify,此时SplObjectStorage类里已存储了两个对象,notify中调用//观察者的update方法。使用Phpstorm会让你的码字速度变快很多哦。

观察者模式适用场景

当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。

当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • /** 优才网公开课示例代码 观察者模式 Observer @author 优才网全栈工程师教研组 @seehtt...
    _EchoFly阅读 179评论 0 0
  • 首先了解观察者模式的概念:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当...
    flamez57阅读 420评论 1 1
  • 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动...
    小陈阿飞阅读 239评论 0 0
  • 有时候找不到朋友一起去吃哪怕只是一顿火锅,真的蛮绝望的,想念以前在云南的小伙伴们,有点看不出来宅和闷骚的我在南京...
    鬮乆阅读 210评论 0 1
  • 夜凉如水,洒落了孤寂。 这孤寂侵占了心里每一处温柔,大大咧咧,横行霸道。 所有纷纷扰扰都似搁浅了,远离了,不见了。...
    君如颜阅读 208评论 0 1