在研究这个模式之前,我们要尽可能的知道面向对象编程的概念,充分了解"对象"的在程序中的含义。
"对象" 是一个有自己的属性、方法的整体。是一个"类"的实例化的个体。我们可以把"类"看成一个概念, 而对象就是这个"概念"的具体化的实例。比如说:”人“就是一个概念,我们都是人,都属于”人“类,我们每一个个体就是”人“类具体化的实例对象,在php中,当我们new一个类生成对象开始,这个对象就在内存中存在,不管我们给这个对象创建多少个引用(把这个对象付给某个或某些变量),这个对象在内存中永远是唯一的,比如:
- class A{}
- $a = new A;//这里创建了一个对象,并且它的引用为 $a
- $b = $a;//$a引用的对象又做了第二个引用$b,注意这里不是复制,复制一个对象用clone方法
- $a->content = 'b';
- unset($a);
- //这时, 释放的$a的内存, 但是它所指向的对象还在内存中存在, 并且它现在仅有一个引用($b)
- echo $b->content; //这里输出: b
好了,理解了上面的内容,接下来的观察者设计模式就相对简单了.
”观察者设计模式", 顾名思义就是有两个成员,一个成员称之为"观察者",一个成员称之为"被观察者",当被观察者的状态发生改变时,可以被所有的观察者收到(个人感觉,有点儿像触发器的),与触发器不同的是,被观察者不需要知道有多少个观察者(宏观上的概念),只需建立观察者时,告诉谁是被观察者就行了,当被观察者发生改变的时候,所有的观察者都要接收到通知,在代码上的表现如下:
- //建立被观察者
- $subject = new Subject;
- //在建立观察者, 这时只需告诉被观察者是谁
- $observer1 = new observer1($subject);
- $observer2 = new observer2($subject);
- $observer3 = new observer3($subject);
- $subject->message = '所有的观察者, 都动起来吧 <hr />';
- $subject->notification();//被观察者并不知道有几个观察者, 只要在建立观察者时, 告诉被观察者是谁就行了
怎么样?神奇吧!哈哈~这是怎么实现的呢?请继续把~
- //被观察者
- class Subject{
- //所有的观察者
- var $observer = array();
- //设置观察者,这个方法由被观察者调用
- function setObserver( $observer ){
- $this->observer[] = $observer;
- }
- //把观察者的状态(或是其他), 通知给被观察者
- function notification(){
- if( !empty($this->observer) ){
- foreach($this->observer as $observer){
- $observer->{$observer->updateFun()}( $this->message );
- }
- }
- }
- }
- //观察者类1
- class observer1{
- //被观察者
- var $subject = '';
- function observer1($subject){
- $this->subject = $subject;
- $this->subject->setObserver($this);
- }
- function updateMessage($message){
- echo '我是 observer1: ' . $this->subject->message;
- }
- //当被通知时, 告诉观察者通知接口
- function updateFun(){
- return 'updateMessage';
- }
- }
- //观察者类2
- class observer2{
- //被观察者
- var $subject = '';
- function observer2($subject){
- $this->subject = $subject;
- $this->subject->setObserver($this);
- }
- function update($message){
- echo '我是 observer2: ' . $this->subject->message;
- }
- //当被通知时, 告诉观察者通知接口
- function updateFun(){
- return 'update';
- }
- }
- //观察者类2
- class observer3{
- //被观察者
- var $subject = '';
- function observer3($subject){
- $this->subject = $subject;
- this->subject->setObserver($this);
- }
- function notification($message){
- echo '我是 observer3: ' . $this->subject->message;
- }
- //当被通知时, 告诉观察者通知接口
- function updateFun(){
- return 'notification';
- }
- }
看完了是不是觉得不神奇啦~,有点儿像魔术的意思吧!把所有的控制都封装到了类的里面,在外面直接调用就行了,这就是观察者设计模式,只要按照这个规则写好的代码,然后外面用起来很舒服啦。也就是设计模式要达到的目标!!!