PHP面向对象的设计模式-观察者模式_环球实时

来源:腾讯云

2023-04-29 01:30:22


(资料图片仅供参考)

一、概述

观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都将得到通知并自动更新。这种模式也叫做发布-订阅模式,它能够解决对象之间的耦合关系。

观察者模式有三个角色:Subject(主题)、Observer(观察者)和ConcreteObserver(具体观察者)。Subject是被观察的对象,当它的状态发生改变时,会通知所有观察它的对象。Observer是观察者,它定义了接收通知的接口,所有观察者都实现这个接口。ConcreteObserver是具体的观察者,它实现了Observer接口,当Subject的状态发生改变时,它会接收到通知并作出相应的处理。

观察者模式的优点是可以实现松耦合,即Subject和Observer之间的耦合度很低,它们可以独立地改变而不会影响到对方。此外,观察者模式还支持广播通信,即Subject可以同时通知多个Observer。

二、示例

下面是一个使用观察者模式的示例。假设有一个天气主题,它会随着天气的变化通知所有的观察者。观察者可以是显示天气的页面或者是发送短信的手机应用程序。

定义Subject接口

首先,我们需要定义Subject接口,它定义了注册、移除和通知观察者的方法:

interface Subject{    public function registerObserver(Observer $observer);    public function removeObserver(Observer $observer);    public function notifyObservers();}

定义Observer接口

接下来,我们定义Observer接口,它定义了接收通知的方法:

interface Observer{    public function update($temperature, $humidity, $pressure);}

实现具体的Subject

然后,我们实现具体的Subject类,它维护了一个观察者列表,当它的状态发生改变时,会通知所有观察者::

class WeatherData implements Subject{    private $observers;    private $temperature;    private $humidity;    private $pressure;        public function __construct()    {        $this->observers = array();    }        public function registerObserver(Observer $observer)    {        $this->observers[] = $observer;    }        public function removeObserver(Observer $observer)    {        $key = array_search($observer, $this->observers, true);        if ($key !== false) {            unset($this->observers[$key]);        }    }        public function notifyObservers()    {        foreach ($this->observers as $observer) {            $observer->update($this->temperature, $this->humidity, $this->pressure);        }    }        public function measurementsChanged()    {        $this->notifyObservers();    }        public function setMeasurements($temperature, $humidity, $pressure)    {        $this->temperature = $temperature;        $this->humidity = $humidity;        $this->pressure = $pressure;        $this->measurementsChanged();    }}

实现具体的Observer

最后,我们实现具体的Observer类,它实现了Observer接口的update方法,当它接收到通知时,会更新自己的状态:

class CurrentConditionsDisplay implements Observer{    private $temperature;    private $humidity;    private $pressure;    private $weatherData;        public function __construct(Subject $weatherData)    {        $this->weatherData = $weatherData;        $this->weatherData->registerObserver($this);    }        public function update($temperature, $humidity, $pressure)    {        $this->temperature = $temperature;        $this->humidity = $humidity;        $this->pressure = $pressure;        $this->display();    }        public function display()    {        echo "Current conditions: " . $this->temperature . "F degrees and " . $this->humidity . "% humidity\n";    }}

在这个示例中,WeatherData类是Subject,它维护了一个观察者列表,并实现了注册、移除和通知观察者的方法。CurrentConditionsDisplay类是具体的观察者,它实现了Observer接口的update方法,当它接收到通知时,会更新自己的状态并调用display方法显示当前的天气信息。

使用观察者模式的主要步骤如下:

定义Subject接口,其中包含注册、移除和通知观察者的方法。定义Observer接口,其中包含接收通知的方法。实现具体的Subject类,维护观察者列表,并实现注册、移除和通知观察者的方法。实现具体的Observer类,实现接收通知的方法并更新自己的状态。在主程序中,创建具体的Subject和Observer对象,将Observer对象注册到Subject对象中,当Subject的状态发生改变时,通知所有注册的Observer对象。

关键词:

PHP面向对象的设计模式-观察者模式_环球实时

观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有[详细]
2023-04-29

潍坊文旅局长在淄博烧烤摊疯狂揽客 具体是什么情况?|关注

【潍坊文旅局长在淄博烧烤摊疯狂揽客】4月27日,山东潍坊市文旅局长到淄博“揽客”的视频火了。[详细]
2023-04-28

九江文化建设结硕果!一批项目和单位获通报表扬_全球快消息

九江新闻网讯(黄燕梅 九江日报全媒记者 柯亭依)4月27日,2023年江西省文化强省建设推进大会在九江市召[详细]
2023-04-28

美式“瘟疫”!起底美国枪支暴力背后的社会顽疾

美式“瘟疫”!起底美国枪支暴力背后的社会顽疾详情请见:http: world people com cn n1 2023 0428 c1002-3267604[详细]
2023-04-28

当前消息!剧透|83岁观众回忆建设边疆的青葱岁月,杂技剧《天山雪》惊险和唯美背后,还有这些故事

随着飞机徐徐降落,毕业于上海市马戏学校的新疆杂技演员哈里克和伙伴们与他们的上海教练王雪峰再次相聚了。[详细]
2023-04-28

西法德三国官员会面 批准未来空战系统合作协议

当地时间4月28日,西班牙国防大臣罗夫莱斯、法国国防部长勒科尔尼、德国国防部长皮斯托留斯在西班牙首都马[详细]
2023-04-28

西红柿牛肉汤隔夜了还能吃吗_西红柿炖牛肉做好后能隔夜吗今日更新

1、不建议将煮熟的牛肉和西红柿一起炖过夜。2、不建议将煮熟的西红柿炖牛肉存放过夜,因为煮熟的西红柿炖牛[详细]
2023-04-28

当前关注:澳大利亚塔斯马尼亚州各界愿继续深化与中方交流合作

新华社澳大利亚霍巴特4月28日电(记者岳东兴)澳大利亚塔斯马尼亚州各界人士日前表示,愿继续深化与中国方面[详细]
2023-04-28

洛阳钼业公布一季度业绩 宁德时代高管成公司非执行董事候选人

本报记者肖艳青4月28日晚,洛阳钼业发布了2023年第一季度财报。财报显示,公司实现营业收入442 84亿元,实[详细]
2023-04-28

大学生入伍征兵有何意义_大学生应征入伍意义|环球今热点

1、国防教育对当代大学生的意义及大学生当如何投身国防建设【摘要】大学生国防教育是全民国防教育的重要组[详细]
2023-04-28
版权所有: 西方制冷网 All Rights Reserved
沪ICP备2020036824号-7
联系邮箱:5 626 629 @qq.com