php设计模式之观察者模式

  观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  比方说我有一个类,当用户对账户进行充值的时候,需要给用户添加相应的经验和积分。传统的做法大概的代码如下:

 1 <?php
 2 class Event
 3 {
 4     //用户充值
 5     public function recharge( $money )
 6     {
 7         echo "我充值了 ¥{$money} 元! <br/>";
 8 
 9         //执行增加积分方法
10         echo "增加100积分<br/>";
11 
12         //执行增加经验方法
13         echo "增加成长经验50<br/>";
14     }
15 }
16 
17 $event = new Event();
18 $event->recharge( 200 );

  比如某一天,突然接到用户充值之后不用给用户增加经验了或是用户充值之后要赠送用户相应的礼券,等等这样的修改需求。那传统的做法就是去修改recharge方法不停的追加或是删除其中的代码。这种方式就是侵入式的。代码的耦合度非常的高,也违背了开放与封闭原则。当系统变大之后很难维护,或是换一个新人,他没有找到准确的位置,可能导致正在运行的程序出错。那利用观察者模式怎么解决这种问题呢? 

 1 <?php
 2 //事件发生者
 3 class Event
 4 {
 5     private $observers = [];  //观察者数组
 6 
 7     //添加观察者
 8     public function addObservers( IObservers $sub )
 9     {
10         $this->observers[] = $sub;
11     }
12 
13     //触发通知观察者
14     public function trigger()
15     {
16         if (!empty($this->observers)) {
17             foreach ($this->observers as $key => $vo) {
18                 $vo->update();
19             }
20         }
21     }
22 
23     //用户充值
24     public function recharge( $money )
25     {
26         echo "我充值了 ¥{$money} 元! <br/>";
27     }
28 }
29 
30 //观察者接口
31 interface IObservers
32 {
33     public function update();
34 }
35 
36 //更新用户的积分观察者
37 class PointAdd implements IObservers
38 {
39     public function update()
40     {
41         echo "增加100积分<br/>";
42     }
43 }
44 
45 //增加用户经验的观察者
46 class ExperienceAdd implements IObservers
47 {
48     public function update()
49     {
50         echo "增加成长经验50<br/>";
51     }
52 }
53 
54 //客户端
55 class Client
56 {
57     public function __construct()
58     {
59         $obj = new Event();
60         $obj->recharge( 200 );  //用户充值200块
61 
62         //添加观察者
63         $obj->addObservers( new PointAdd() );
64         $obj->addObservers( new ExperienceAdd() );
65 
66         $obj->trigger();  //通知观察者更新
67     }
68 }
69 
70 header('Content-type:text/html;charset=utf-8');
71 new Client();

  把每一种状态的改变当成一个观察者,事件触发者触发事件时,通知与之关联的观察者去更新。比如我不需要给用户增加积分,我只需要将63行的代码注释掉即可。

posted @ 2016-11-29 17:09  NickBai  阅读(209)  评论(0编辑  收藏  举报