[TOC]依赖注入策略模式单例模式观察者模式观察者模式让我们看看订阅报纸和杂志是如何工作的:报社的业务是出版报纸。订阅报纸,每当他们发表新论文时,就会将其发送给您。如果您不想再阅读该论文,请取消订阅,他们将不会提供新论文。只要报纸还在营业,人们就会一直订阅或退订它们。Observer模式就像订阅报纸,只是知识名称不同:发布者改为“Subject”,订阅者称为“Observer”。实现观察者模式的方法不止一种,但最常见的是包含Subject和Observer接口的类设计。主题可以注册和注销观察者,当数据发生变化时,可以通知观察者;所有的观察者都必须继承观察者接口,这个接口只有一个update()方法,当主题状态改变时调用。主题继承SplSubject,是PHP内置观察者模式的主题接口;观察者继承SplObserver;同时,主题使用SplObjectStorage来存储观察者列表。这是主题:observers=new\SplObjectStorage();}/***注册观察者**附加一个SplObserver*@linkhttps://php.net/manual/en/splsubject.attach。php*@paramSplObserver$observer
*要附加的SplObserver。*
*@returnvoid*@since5.1.0*/publicfunctionattach(SplObserver$observer){$this->observers->attach($observer);}/***注销观察者**分离观察者*@linkhttps://php.net/manual/en/splsubject.detach.php*@paramSplObserver$observer*SplObserver分离。*
*@returnvoid*@since5.1.0*/publicfunctiondetach(SplObserver$observer){$this->observers->detach($observer);}}/***通知观察者*通知观察者*@linkhttps://php.net/manual/en/splsubject。notify.php*@returnvoid*@since5.1.0*/publicfunctionnotify(){//循环调用观察者自身的update方法if($this->observers->count()>0){/**@var\SplObserver$observer*/foreach($this->observersas$observer){$observer->update($this);}}}/***数据改变,同时通知观察者**@param$upd_data*/publicfunctionupdData($upd_data){$this->upd_data=$upd_data;//当数据发生变化时,在需要通知观察者的地方调用notify$this->notify();}/***消息变化,同时通知观察者**@param$upd_msg*/publicfunctionupdMsg($upd_msg){$this->upd_msg=$upd_msg;//这个notify也可以不写在方法里,灵活使用$this->notify();}/***@returnmixed*/publicfunctiongetUpdData(){return$this->upd_data;}/***@returnmixed*/publicfunctiongetUpdMsg(){return$this->upd_msg;}}有一只猫CatObserver:*SplSubject通知观察者更新。**@returnvoid*@since5.1.0*/publicfunctionupdate(\SplSubject$subject){//这个$subject一开始很难理解,但最后发现真的很聪明//我觉得这个实现是最好的,具体要获取的更新由注册的观察者的主题决定//Observer主题的细节我不知道,只知道实现了观察者接口/***@varSubject$subject*/$listen_data=$subject->getUpdData();$listen_msg=$subject->getUpdMsg();echo'我是猫观察我得到新数据:'。$listen_data。';消息:'。$listen_msg;回声'';}}还有一个狗观察者:getUpdData();$listem_msg=$subject->getUpdMsg();echo'我是狗观察者,数据:'。$listen_data。';消息:'。$listem_msg;回声'
';}}看看这个调用:attach($catObserver);$subject->attach($dogObserver);//主题变化,而观察者得到相应的变化$subject->updData(12);$subject->updMsg('你妈妈叫你回家吃饭');显示结果:我是catwatcher,我得到新数据:12;msg:我不应该吃东西我是dogwatcher,data:12;msg:IshouldnoteatyetIamCatwatcher,我得到新数据:12;留言:你妈妈叫你回家吃饭我是DogObserver,data:12;msg:你妈妈叫你回家吃饭看我的例子你应该能看懂Observer模式,看看你学到了什么:00原则-松散对象之间的耦合设计。观察者模式--定义对象之间一对多的依赖关系,这样当一个对象改变状态时,依赖于它的对象会得到通知并自动更新。观察者模式定义了对象之间的一对多关系。Observer不知道Observer的细节,也不知道Subject的细节,只知道实现了Observer接口。