后端开发|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、总结
观察者模式解除了主体和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。