Observer - 观察者模式
来源:互联网 发布:淘宝美工难吗 编辑:程序博客网 时间:2024/05/29 09:45
观察者模式:
<?phpinterface Subject{public function notify();public function attach(Observer $observer);public function detach(Observer $observer);}class LoginSubject implements Subject{private static $observers = array();public function attach(Observer $observer){if (!array_search($observer, self::$observers)) {self::$observers[] = $observer;}}public function detach(Observer $observer){foreach (self::$observers as $obs) {if ($obs != $observer) {$newObservers[] = $obs;}}self::$observers = $newObservers;}public function notify(){foreach (self::$observers as $obs) {$obs->update($this);}}public function login(){// 处理登录,设置登录状态// setStatus();}// 返回登录状态信息public function getStatus(){switch(rand(1,3)) {case 1:$status = array('200', 'vboy1', '127.0.0.1');break;case 2:$status = array('400', 'vboy2', '127.0.0.2');break;case 3:$status = array('500', 'vboy3', '127.0.0.3');break;}return $status;}}interface Observer{public function update(Subject $subject);}abstract class LoginObserver implements Observer{private $_login;public function __construct(LoginSubject $loginSubject){$this->_login = $loginSubject;$loginSubject->attach($this);}public function update(Subject $subject){if ($subject === $this->_login) { // 保证调用update函数的对象是LoginSubject类型$this->doUpdate($subject);}}abstract public function doUpdate(LoginSubject $loginSubject);}class log extends LoginObserver{public function doUpdate(LoginSubject $loginSubject){$status = $loginSubject->getStatus();if ($status[0] == '200') {// Logger::successLogin(); // 记录登录日志}}}class mail extends LoginObserver{public function doUpdate(LoginSubject $loginSubject){$status = $loginSubject->getStatus();if ($status[0] == '400') {// Mailer::send(); // 发邮件通知管理员}}}$loginSubject = new LoginSubject();new log($loginSubject);new mail($loginSubject);$loginSubject->notify();
SplObjectStorage是一个工具类,用于更好的存储对象和删除对象。
如下所示:
<?phpclass Login implements SplSubject{private $_observers;public function __construct(){$this->_observers = new SplObjectStorage();}public function attach(SplObserver $observer){$this->_observers->attach($observer);}public function detach(SplObserver $observer){$this->_observers->detach($observer);}public function notify(){foreach ($this->_observers as $obs) {$obs->update($this);}}public function getStatus(){switch(rand(1,3)) {case 1:$res = 1;break;case 2:$res = 2;break;case 3:$res = 3;break;}return $res;}}abstract class LoginObserver implements SplObserver{private $login;public function __construct(Login $login){$this->_login = $login;$login->attach($this);}public function update(SplSubject $subject){if ($subject === $this->_login) {$this->doUpdate($subject);}}abstract function doUpdate(Login $login);}class log extends LoginObserver{public function doUpdate(Login $login){echo __CLASS__ . ':' . $login->getStatus() . ' ';//Logger::login();}}class mail extends LoginObserver{public function doUpdate(Login $login){echo __CLASS__ . ':' . $login->getStatus() . ' ';//Mailer::login();}}$login = new Login();new log($login);new mail($login);$login->notify();
- Observer 模式 观察者模式
- Observer模式 观察者模式
- 观察者模式(OBSERVER)
- 观察者(Observer)模式
- 观察者模式(Observer Pattern)
- 观察者(Observer)模式
- Observer(观察者)模式
- 观察者(Observer)模式
- 观察者(Observer)模式
- 观察者模式-Observer
- 观察者(Observer)模式
- 观察者设计模式Observer
- 观察者模式(Observer Pattern)
- 观察者(Observer)模式
- 观察者模式(Observer Pattern)
- Observer 观察者模式
- 观察者模式(Observer Pattern)
- Observer观察者模式小结
- Spring中常用的hql查询方法(getHibernateTemplate())
- 动态设置是否锁屏等
- shell input parameter
- sms class
- Java日期格式化及其使用例子收集
- Observer - 观察者模式
- VMware Network Adapter VMnet1和VMnet8 未识别的网络的解决方法
- Behavior-driven development(BDD)
- [KMP-NEXT数组特性]HDU 3336 Count the string
- Linux实践工程师学习笔记十一:PAM认证模块
- android:paddingLeft与android:layout_marginLeft的区别
- 编程htc的使用
- jdk 安装配置
- Struts实时生成Excel文件下载