
观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有
腾讯云 2023-04-29 06:20:19
【资料图】
观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都将得到通知并自动更新。这种模式也叫做发布-订阅模式,它能够解决对象之间的耦合关系。
观察者模式有三个角色:Subject(主题)、Observer(观察者)和ConcreteObserver(具体观察者)。Subject是被观察的对象,当它的状态发生改变时,会通知所有观察它的对象。Observer是观察者,它定义了接收通知的接口,所有观察者都实现这个接口。ConcreteObserver是具体的观察者,它实现了Observer接口,当Subject的状态发生改变时,它会接收到通知并作出相应的处理。
观察者模式的优点是可以实现松耦合,即Subject和Observer之间的耦合度很低,它们可以独立地改变而不会影响到对方。此外,观察者模式还支持广播通信,即Subject可以同时通知多个Observer。
下面是一个使用观察者模式的示例。假设有一个天气主题,它会随着天气的变化通知所有的观察者。观察者可以是显示天气的页面或者是发送短信的手机应用程序。
首先,我们需要定义Subject接口,它定义了注册、移除和通知观察者的方法:
interface Subject{ public function registerObserver(Observer $observer); public function removeObserver(Observer $observer); public function notifyObservers();}
接下来,我们定义Observer接口,它定义了接收通知的方法:
interface Observer{ public function update($temperature, $humidity, $pressure);}
然后,我们实现具体的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接口的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对象。观察者模式是一种行为设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有
4月28日,众安智慧生活服务有限公司再次递表港交所。根据最新招股书,截至2022年12月31日众安智慧生活拥有
五一小长假将至,各地居民积累已久的出游需求在节前已提前释放。4月28日,《每日经济新闻》记者从各大本地
1、是的以前是在平顶山八中对面不过现在搬到武警医院附近了他们现在用的是曾为平顶山学院(就是师专)的校
1、脱腋毛用533抑毛绝毛液是很好的。2、可以抑制汗毛生长。3、使用后会慢慢变细变少。本文到此分享完毕,希
格隆汇4月27日丨星宇控股(02346 HK)公告,由于张剑滔先生希望专注于自身其他业务承担,彼已辞任公司非执行
4月25日,保亭黎族苗族自治县召开五一节前旅游市场综合监管约谈会议,各景区、酒店、餐饮店、网吧、歌舞娱
市气象台4月27日16时发布大风黄色预警信号受冷空气影响,预计28日夜间到29日白天我市西北风风力较大,最大
1、观致是中国的品牌!我关注这个品牌很久了,因为他也算是为咱们国家汽车产业争了一口气具体看下面分析!
“五一”假期到来,全国各地餐饮、住宿、出游热度持续攀升,你是否已经有出游计划?如果还没有,那广东也许
去年营收破千亿,出货量“三连冠”!详情
2023年6月acca考试报名即将截止,各位小伙伴们也可以登录ACCA官网查询。6月acca报名时间安排如下:开始报名
4月28日,国网陕西西乡县供电公司张思德“牧河之光”党员服务队深入到各旅游景点、酒店宾馆、交通枢纽、党
五一期间,徐汇区景观照明开启节假日模式,徐家汇商圈、徐汇滨江、上海南站等重点区域流光溢彩,打造夜景标
2023年4月28日,深交所向*ST海核(SZ002366,收盘价:5 22元)发出问询函:针对“年报显示,你公司报告期锻