观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

Ø 主要解决

一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

Ø 何时使用

1.对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。

2.对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

Ø 优点

1.观察者模式在被观察者和观察者之间建立一个抽象的耦合。

2.观察者模式支持广播通讯。

3.建立一套触发机制。

Ø 缺点

1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

Ø 应用场景

1.ABC5项目约课模块

2.以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑

Ø 实现

ABC5项目约课模块:

1.插入日志

2.后发送短信

3.后其他各类操作

被观察者接口Subject.php

interface Subject{  
    public function register(Observer $observer);  
    public function notify();  
} 
 

被观察者Action.php

class Action implements Subject{  
    public  $_observer = [];  
    public function register(Observer $observer){  
        $this->_observer[]= $observer;  
    }  
    public function notify(){  
        foreach ($this->_observer as $observer){  
            $observer -> watch();  
        }  
    }  
}  

Observer.php(观察者接口)

interface Observer{  
    public function watch();  
}  

Log.php(观察者-插入日志)

class Log implements Observer{  
    public function watch(){  
        echo '插入日志<br>';  
    }  
}   

Send.php(观察者-发送短信)

class Send implements Observer{  
    public function watch(){  
        echo '发送短信<br>';  
    }  
}  

Ohter.php(观察者-其他操作)

class Other implements Observer{  
    public function watch(){  
        echo '其他操作<br>';  
    }  
}  

调用测试

$action=new App\Observer\Action();  
$action->register(new \App\Observer\Log());  
$action->register(new \App\Observer\Send());  
$action->register(new \App\Observer\Other());  
$action->notify();  
评论

0 条评论