PHP设计模式-观察者模式

史蒂芬劳埃德沃特金斯 ,周二09年12月29日下午10时02

我一直在阅读深入浅出设计模式 最近已决定为PHP写的例子为我自己的利益的一些模式。 第一个,我已经决定了的代码是Observer模式 该观察模式的正式定义是:

观察者模式 (一异步子集发布/订阅模式 )是一种软件 设计模式 ,其中一个对象 ,叫做主体,维护一个观察员的名单及其家属,要求,并通知他们自动的任何状态变化,要求通常是由他们的一个方法 它主要用于实现分布式事件处理系统。

随着系统变得更加松耦合确保事件发生时系统,这需要所有这些更新知识的了解。 例如,一个博客文章,救了他的文章中,我们可能需要更新的搜索引擎(如Lucene的),更新我们的地图,标签,电子邮件订阅用户等观察员模式允许开发者添加更多的听众不编辑的观察对象。 通过注射观察员(即搜索引擎更新的观察员,一个sitemap发电机等):一个主题(即博客文章编辑系统),我们可以允许它来执行无任何变化的所有必要的更新。

观察者模式之前惯用的伎俩是确定的将是更新的代码来更新所需的系统附加行的观察对象,并删除的代码行的要求。 这并不容易允许添加和删除观察员。

该方法通过更新其观察员所有学科的更新。 此更新方法调用在每个观测方法,是从实现接口派生。 观察员可以通过添加删除方法在观察对象本身。

这基本上就是它! 我一直觉得一个例子,是学习/了解,这里是我的代码示例,最好的方法...

Observer模式在PHP中

在我的例子中,我已经创建了一个新闻系统(NewsAggregator),它发出的头条新闻更新,更小的新闻联播。 这里的新闻系统正以地方新闻的主体,可观察的,而饲料等方面的作用采取的听众观察员

一旦初始化观察员可以附加和分离从服从,因为他们认为合适的。 在我的例子,我创建了三个观察员,这些扫描的头条新闻发送出来的主题和'喊',如果它适当的消息。 这三个观察员下述条件,他们随着扫描当接收新闻标题:

  • 体育观察:'橄榄球','足球','网球'
  • 新闻观察:'政治','金融','政府'
  • 八卦观察员:'名人','音乐','时尚'

这个问题后initalising我添加的新闻和八卦观察员和发送的新闻更新。 在此之后加入这项运动的观察员以前更多的新闻更新发送出去。 最后的八卦观察员被删除前最后的新闻标题是发送出去。

三个不同的类实现接口观察员观察员 ,这让他们有一个清晰的接口/方法,通过它们将得到更新。 只要他们实现Observer接口,他们将能够自行附加的主题 这也能配合的编程范式的程序界面而不是实现'。 NewsAggregator类扩展了抽象类科目 ,它提供了三种方法,我们需要与公众:

  1. updateObservers()
  2. addObserver()
  3. removeObserver()

该代码可以看出东奔西跑, 观察员PHP的运行模式 ,代码就可以了,从这里下载Observer模式PHP代码

观察员脚本

  <?PHP的
 / **
  *本文件包含的观察员
  *
  * @作者劳埃德沃特金斯
  * @自2009/12/23
  * /

抽象类科目
 {
	抽象的公共职能addObserver(观察员$观察员);
	抽象的公共职能removeObserver(观察员$观察员);
	抽象的公共职能updateObservers($ newsHeadline);
 }

 / **
  *这是Subject类的例子
  *
  * @作者劳埃德沃特金斯
  * @自2009/12/23
  * /
类ArticleAggregator扩展科目
 {
	 / **
	  *保存我们的观察员名单
	  *
	 风险值的数组* @
	  * /
	 = $ _observerList保护阵列();

	 / **
	  *方法添加观察员
	  *
	  * @ $风险观察员观察员
	  * @返回void
	  * /
	公共职能addObserver(观察员$观察员)
	 {
		 $这个-> _observerList [] = $观察员;
	 }

	 / **
	  *法去除观察员
	  *
	  * @ $风险观察员观察员
	  * @返回布尔
	  * /
	公共职能removeObserver(观察员$观察员)
	 {
		的foreach($这个-> _observerList美元的关键“=> $ OB)的{
			如果($转播== $观察员){
				取消设置($这个-> _observerList [$键]);
				返回true;
			 }
		 }
		返回false;
	 }

	 / **
	  *方法更新观察员
	  *
	  * @风险字符串$ newsHeadline
	  * @返回void
	  * /
	公共职能updateObservers($ newsHeadline)
	 {
		的foreach($这个->转播_observerList美元){
			 $的OB ->“更新($ newsHeadline);
		 }
	 }

	 / **
	  *添加一个新的新闻故事
	  *
	  * @风险字符串$故事
	  * @返回void
	  * /
	公共职能addNewsStory($故事)
	 {
		如果(空($故事)| |!is_string($故事)){
			抛出新InvalidArgumentException('需要一个新闻故事!');
		 }
		 $这个-> updateObservers($故事);
	 }
 } 

主题/观测脚本

 ?<的PHP / ** *本文件包含主题* * @作者沃特金斯劳埃德自2009/12/23 * * @ / {抽象的抽象类科目公共职能addObserver(观察员$观察员);抽象的公共职能removeObserver(观察员$观察员);抽象的公共职能updateObservers($ newsHeadline);} / ** *这是为示例* * @作者Subject类沃特金斯劳埃德自2009/12/23 * * @ /类ArticleAggregator扩展科目{/ ** *保存我们的观察员名单* * @风险数组* / $ _observerList =保护阵列(); / ** *方法,将观察员* * @ $风险观察员观察员* @返回void * /公共职能addObserver(观察员$观察员) {$这个-> _observerList [] = $观察员;} / ** *方法来删除一个观察者* * @ $风险观察员观察员* @返回布尔值* /公共职能removeObserver(观察员$观察员)的{foreach($这个->美元_observerList关键“=> $转播){如果($转播== $观察员){未设置($这个-> _observerList [$键]);返回true;}}返回false;} / ** *方法来更新观察员* * @ $ newsHeadline风险字符串* @返回void * /公共职能updateObservers($ newsHeadline)的{foreach($这个-> _observerList美元的转播){$观测->“更新($ newsHeadline);}} / ** *添加一个新的新闻故事* * @风险字符串$故事* @返回void * /公共职能addNewsStory($故事){如果(空($故事)| |!is_string($故事)){抛出新InvalidArgumentException('需要一个新闻故事');} $这个-> updateObservers($故事);}} 

控制器脚本

  <?PHP的
 / **
  *观测器设计模式的例子
  *
  * @作者劳埃德沃特金斯
  * @自2009/12/23
  * @链接http://www.evilprofessor.co.uk
  * /
包括'observers.php';
包括'subject.php';

如果(!空(使用$ _SERVER ['HTTP_USER_AGENT'])){
    回声'
  ';
 }

 / /我们在做什么?
 echo的观察员模式的例子PHP中的'。  PHP_EOL;
回声'================================'。  PHP_EOL;
 / /设置我们的主题
新ArticleAggregator主题= $();
回声' - ArticleAggregator创造'。  PHP_EOL;

 / /添加一些观察家
 $主题> addObserver(新NewsObserver());
 $主题> addObserver($ =新GossipObserver闲话());

回声' - 新增NewsObverser&GossipObserver'。
	  PHP_EOL。  PHP_EOL;

 / /嘟,嘟,嘟... 快讯!
 echo的资讯站:名人热爱橄榄球运动员金融'。  PHP_EOL;
回声'================================================ '。  PHP_EOL;
 $主题> addNewsStory('名人橄榄球运动员喜欢金融');
回声PHP_EOL;

回声' - SportObserver已经发现了,想加入本集团';
 $主题> addObserver(新SportObserver());
回声PHP_EOL。  PHP_EOL;

 / /嘟,嘟,嘟... 快讯!
 echo的资讯站:政府弄乱了!'   PHP_EOL;
回声'======================================='。  PHP_EOL;
 $主题> addNewsStory('政府弄乱了!');
回声PHP_EOL;

 / /嘟,嘟,嘟... 快讯!
 echo的资讯站:时尚和足球结合'。  PHP_EOL;
回声'======================================='。  PHP_EOL;
 $主题> addNewsStory('时尚和足球结合');
回声PHP_EOL;

 / /嘟,嘟,嘟... 快讯!
 echo的资讯站:音乐与政治,下一步如何?   PHP_EOL;
回声'=========================================='。  PHP_EOL;
 $主题> addNewsStory('音乐与政治,何去何从?');
回声PHP_EOL;

 / **
  *闲话增长很快厌倦了新​​闻,并已决定
  *不能听,尽管所有的有趣的消息,今天!
  * /
回声' - GossipObserver是无聊和离任本集团! 
      PHP_EOL。  PHP_EOL;
 $主题> removeObserver($闲话);

 / /嘟,嘟,嘟... 快讯 - 更新到一个较早的故事!
 echo的最新资讯:时尚和足球结合说'。
      '政府'。  PHP_EOL;
回声'================================================ '。
      '========='。  PHP_EOL;
 $主题> addNewsStory('时尚和足球结合'。
                         '说,政府');
回声PHP_EOL;

如果(!空(使用$ _SERVER ['HTTP_USER_AGENT'])){
    回声' 

';

}

3回应“PHP设计模式 - 观察者模式”

  1. 发誓 说:

    您好,
    首先,我的英语很差,然后
    你能告诉我什么是照片中的制度?
    Fedora的12?
    什么是主题?

  2. 发誓 说:

    您好,
    你能告诉我什么是照片中的制度?
    Fedora的12?
    什么是主题?

给一个答复













全景主题 Themocracy

现在4访客在线
3位客人,一机器人,0位会员
今天最大游客:在07:57上午12点联合技术
本月:22日2011年8月6日上午12:30联合技术
今年:130 28-03-2011下午10时40联合技术
所有时间:130 28-03-2011下午10时40联合技术