900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > PHP 设计模式系列 — 观察者模式(Observer)

PHP 设计模式系列 — 观察者模式(Observer)

时间:2022-09-30 14:53:51

相关推荐

PHP 设计模式系列 — 观察者模式(Observer)

后端开发|php教程

PHP 设计模式系列 — 观察者模式(Observer)

后端开发-php教程

网站源码phpcms,ubuntu 系统设置卡住,牛粪中爬虫药用,php foeeach,SEO网站采集lzw

1、模式定义

观察者模式有时也被称作发布/订阅模式,该模式用于为对象实现发布/订阅功能:一旦主体对象状态发生改变,与之关联的观察者对象会收到通知,并进行相应操作。

ocr文字识别 源码,vscode关闭对比模式,ubuntu 亮度调节,yum tomcat6,sqlite长度,极简主义的网页设计,远程连接vps数据库,企业网站租服务器,移动端弹层插件,怎么评价前端三大框架的优点,Al爬虫,php auth,seo背景,springboot服务程序,织梦php写入自定义标签中,一个页面的网站源码,网页在线投票系统,sdcms模板怎么安装,织梦模板后台,html添加页面模板,物流管理系统 sql,asp政府单位网站源码程序lzw

将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。

历史站源码,ubuntu界面有延迟,基于爬虫的seo,php oed,衡阳seo 优化lzw

消息队列系统、事件都使用了观察者模式。

PHP 为观察者模式定义了两个接口:SplSubject 和SplObserver。SplSubject 可以看做主体对象的抽象,SplObserver 可以看做观察者对象的抽象,要实现观察者模式,只需让主体对象实现 SplSubject ,观察者对象实现 SplObserver,并实现相应方法即可。

2、UML类图

3、示例代码

User.php

observers = new \SplObjectStorage(); } /*** 附加观察者** @param \SplObserver $observer** @return void*/ public function attach(\SplObserver $observer) { $this->observers->attach($observer); } /*** 取消观察者** @param \SplObserver $observer** @return void*/ public function detach(\SplObserver $observer) { $this->observers->detach($observer); } /*** 通知观察者方法** @return void*/ public function notify() { /** @var \SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } /**** @param string $name* @param mixed $value** @return void*/ public function __set($name, $value) { $this->data[$name] = $value; // 通知观察者用户被改变 $this->notify(); }}

UserObserver.php

<?phpnamespace DesignPatterns\Behavioral\Observer;/** * UserObserver 类(观察者对象) */class UserObserver implements \SplObserver{ /*** 观察者要实现的唯一方法* 也是被 Subject 调用的方法** @param \SplSubject $subject*/ public function update(\SplSubject $subject) { echo get_class($subject) . has been updated; }}

4、测试代码

Tests/ObserverTest.php

observer = new UserObserver(); } /*** 测试通知*/ public function testNotify() { $this->expectOutputString(DesignPatterns\Behavioral\Observer\User has been updated); $subject = new User(); $subject->attach($this->observer); $subject->property = 123; } /*** 测试订阅*/ public function testAttachDetach() { $subject = new User(); $reflection = new \ReflectionProperty($subject, observers); $reflection->setAccessible(true); /** @var \SplObjectStorage $observers */ $observers = $reflection->getValue($subject); $this->assertInstanceOf(SplObjectStorage, $observers); $this->assertFalse($observers->contains($this->observer)); $subject->attach($this->observer); $this->assertTrue($observers->contains($this->observer)); $subject->detach($this->observer); $this->assertFalse($observers->contains($this->observer)); } /*** 测试 update() 调用*/ public function testUpdateCalling() { $subject = new User(); $observer = $this->getMock(SplObserver); $subject->attach($observer); $observer->expects($this->once()) ->method(update) ->with($subject); $subject->notify(); }}

5、总结

观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。