1. 程式人生 > >設計模式(三)--觀察者模式

設計模式(三)--觀察者模式

觀察者模式:定義了物件間的一種一對多的依賴關係,當被觀察的物件發生改變時,所有依賴於它的物件都會得到通知並被自動更新,而且被觀察的物件和觀察者之間是鬆耦合的。在該模式中,有目標(Subject)和觀察者(Observer)兩種角色。目標角色是被觀察的物件,持有並控制著某種狀態,可以被任意多個觀察者作為觀察的目標。也叫釋出--訂閱模式

簡單例項:再PC端登入帳號時,其他客戶端帳號被踢下線,實現同一時間只能在一處登入帳號。

//目標,被觀察
class user implements SplSubject {

    public $username='';
    public $password
=''; public $observers=null; public function __construct($username,$password){ $this->username=$username; $this->password=$password; $this->observers=new SplObjectStorage(); } public function attach(SplObserver $observer) { // TODO: Implement attach() method.
$this->observers->attach($observer); } public function detach(SplObserver $observer) { // TODO: Implement attach() method. $this->observers->detach($observer); } public function notify() { // TODO: Implement notify() method. $userinfo
['username']=$this->username; foreach ($this->observers as $observer) { $observer->update($this, $userinfo); } } public function login(){ echo 'PC: '.$this->username.' login in'; //通知 $this->notify(); } } class ios implements SplObserver{ public function update(SplSubject $subject) { // TODO: Implement update() method. if (func_num_args() === 2) { $userinfo = func_get_arg(1); echo "<br>"; echo 'IOS: ' . $userinfo['username'] . ' login out '; } } } class android implements SplObserver{ public function update(SplSubject $subject) { // TODO: Implement update() method. if (func_num_args() === 2) { $userinfo = func_get_arg(1); echo "<br>"; echo 'android: ' . $userinfo['username'] . ' login out '; } } } $user=new user('tom','123456'); //新增觀察者 $user->attach(new ios()); $user->attach(new android()); //通知 $user->login();

詳細請參考:

https://www.ibm.com/developerworks/cn/opensource/os-cn-observerspl/