时间:2019-10-12 00:01:16
用模式开发的优点是,能让我们的逻辑结构以及代码更加清晰,便于维护!
而我们为什么要用 “观察者模式”?这就需要从实际运用中来理解才能更好的运用!用自己理解的情景来说明吧:
事例,开始时我被安排做项目的登录,很快我就完成了。然后产品提出了另一个需求,用户登录后,给他们推送一条实时消息!然后我在登录成功的逻辑后加了一段代码,完成了登录后的实时消息推送。然而事情还没有完,产品又给加了个需求,需要给新登录的用户10块钱红包奖励,这个当然很简单,我又在消息推送后加了代码,完成了新登录用户的红包奖励(钱怎么到账的过程暂且不论),然而事情还没完没了了,产品不断的在加需求了,如非vip用户登录,给他推送10条需要注册VIP才能打开的信息,如根据客户习惯推送10条客户偏好的信息,如vip快到期的客户需要在客户登录后提醒要充值啦。。。。。。。等等,如是这般,那我就得不停的在登录后加代码,变得我开始看不懂哪个xxx写的代码了!
官方名词解释如下:
观察者模式(Observer),当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新。观察者模式的核心在于Subject和Observer 接口。Subject包含一个给定的状态,观察者"订阅"这个主题,将主题的当前状态通知观察者。可以认为它是一个博客,有很多订阅者,会定期地为订阅或定期阅读博客的各类用户更新一组信息。每次博客发生改变时(其状态改变),所有订阅者"都会得到通知"。
说了半天可能还不是很理解吧 ,直接上类图
【观察者模式类图】:

【观察者模式中主要角色】
1.抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者。 抽象主题提供了增加和删除观察者对象的接口。
2.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。
3.具体主题(ArticleSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
4.具体观察者(ArticleObserver)角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致。
【观察者模式的优点和缺点】
观察者模式的优点:
1.观察者和主题之间的耦合度较小;
2.支持广播通信;
观察者模式的缺点:
由于观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。这可能会引起意外的更新。
【观察者模式适用场景】
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。
典型的用列:用户注册(验证邮件,用户信息激活),购物网站下单时邮件/短信通知等
【观察者模式PHP示例】
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
|

本文探讨了观察者模式在软件开发中的应用,通过实例展示如何在不断变化的需求中利用该模式管理登录功能的扩展,以及其优点(如解耦和广播通信)和潜在的缺点(过度通知)。作者提供了PHP的观察者模式实现作为参考。
1336

被折叠的 条评论
为什么被折叠?



