观察者模式

观察者模式解释:

 观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依 赖于它的对象都得到通知并自动刷新。它完美的将观察者对象和被观察者对象分离。可以在独立的对象(主体)中维护一个对主体感兴趣的依赖项(观察器)列表。 让所有观察器各自实现公共的 Observer 接口,以取消主体和依赖性对象之间的直接依赖关系。

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新【GOF95】 又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式


【观察者模式中主要角色】

1.抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者。 抽象主题提供了增加和删除观察者对象的接口。
2.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。
3.具体主题(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
4.具体观察者(ConcretedObserver)角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致。

【观察者模式的优点和缺点】

观察者模式的优点:

1.观察者和主题之间的耦合度较小;
2.支持广播通信;

观察者模式的缺点:

由于观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。这可能会引起意外的更新。


<?php

/**

 *参考IBM官网:http://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/

 *@author http://www.phpddt.com

 */

//观察者

interface IObserver 

{

public function notify();

}

 

//定义可以被观察的对象接口

interface IObservable 

{

public function addObserver($observer);

}

 

//实现IObservable接口

class MessageSystem Implements IObservable 

{

private $_observers = array();

 

public function addObserver($observer)

{

$this->_observers = $observer;

}

 

public function doNotify()

{

foreach($this->_observers as $o)

{

$o->notify();

}

}

}

 

//实现IObserver接口

class User Implements IObserver

{

public function __construct($username)

{

echo "我是新用户{$username}<br/>";

}

//通知观察者方法

public function notify()

{

echo '欢迎新用户';

}

}

 

//使用

$u = new MessageSystem();

 

$u->addObserver(new User('小明'));

//$u->addObserver(new User('小红'));

//$u->addObserver(new User('小黑'));

 

$u->doNotify();

个人理解:抽象主题 实际是一个主题方法接口 具体主题则是执行这些接口的类

                 抽象观察者 也一样是一个观察者接口  具体的观察者则是执行这些接口的类

 打个比方 就是好比 当你一个人注册时,你会收到一条注册信息,这就是观察者自身变化所引起的。

                 而 像每个注册用户都会收到一封群发邮件酱紫的,那就是主题自身发生变化,从而联动所有对应的观察者。


转载于:https://my.oschina.net/bo081220/blog/649948

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值