标签:
先上代码:
<?php function buy($user) { echo "buy success\n"; return true; } class User { private $_observers = array(); public function register($sub) { /* 注册观察者 */ $this->_observers[] = $sub; } public function trigger() { /* 外部统一访问 */ if(!empty($this->_observers)){ foreach($this->_observers as $observer){ $observer->update(); } } } } /** * 观察者要实现的接口 */ interface Observerable{ public function update(); } class Sms implements Observerable{ public function update(){ echo "Sms notify\n"; } } class Email implements Observerable { public function update() { echo ‘Email notify‘; } } $u = new User(); $u->register(new Sms()); $u->register(new Email()); if (buy($u)) { $u->trigger(); }
如果不把那两个sms和Email这连个类放进user中的话,如果sms不需要了。或者需要修改的话,那么就需要修改一些核心类user内的内容。因为Email和sms属于不同的功能,在不同的场合可能user中需要不同的类(sms或者是Email),如果写两个这样的user类的话,就太冗余了。这种模式中user类中的register方法,就好像一个入口,需要哪一种具体的方法(sms或者Email)时,只需要用这个方法,把不同的对象加入到user对象内就可以了,然后用这些加入进去的对象(sms或者Email)调用他们相关的方法
标签:
原文地址:http://www.cnblogs.com/tobemaster/p/5747279.html