الگوهای طراحی پی اچ پی -- الگوی آبزرور

توسط استیون لوید Watkin ، سه 2009 دسامبر 29 22:02

من شده است خواندن رئیس اول الگوهای طراحی و به تازگی تصمیم گرفته اند برای نوشتن برخی از الگوهای به عنوان نمونه پی اچ پی برای نفع خود من است. یکی از اولین بار که من تصمیم به کد بالا است الگوی آبزرور . تعریف رسمی از الگوی آبزرور است :

الگوی ناظر (زیر مجموعه ای از ناهمگام نشر / عضویت در الگوی ) است نرم افزار الگوی طراحی است که در آن شیء ، موسوم به موضوع ، حفظ می کند لیستی از افراد وابسته به آن ، ناظر نامیده می شود ، به استحضار می رساند و آنها را به طور خودکار از تغییر دولت وجود داشته باشد ، معمولا توسط تماس یکی از آنها روش . این است که عمدتا مورد استفاده برای پیاده سازی سیستم های توزیع رویداد دست زدن.

به عنوان سیستم های تر شل همراه مطمئن شوید که هنگامی که رویداد اتفاق می افتد تمام سیستم های که نیاز به آگاهی از این بروز رسانی ها مطلع هستند. به عنوان مثال ، پست وبلاگ ، بعد از حفظ یک پست ممکن است ما نیاز به یک موتور جستجو (به عنوان مثال Lucene) برای به روز رسانی ، بروز رسانی نقشه سایت ما ، برچسب ها ، ایمیل مشترک کاربران و غیره الگوی ناظر اجازه می دهد توسعه دهندگان برای اضافه کردن شنوندگان اضافی بدون ویرایش شی قابل مشاهده آنها . با تزریق ناظران (به عنوان مثال موتور جستجوی ناظر بروز رسانی ، ژنراتور نقشه ، و غیره) را به موضوع (یعنی سیستم پست وبلاگ در حال ویرایش) ما می توانیم اجازه می دهد آن را به انجام همه به روز رسانی لازم است بدون هیچ تغییری.

قبل از طرح ناظر بر فوت و فن معمول خواهد بود شی قابل مشاهده تا با خط اضافی از کد برای به روز رسانی سیستم مورد نیاز بروز رسانی مشخص شده بود ، و از بین بردن خط از کد به عنوان مورد نیاز است. این کار به راحتی برای اضافه کردن و حذف ناظران اجازه نمی دهد.

موضوع روز رسانی همه از ناظران خود را از طریق روش بروز رسانی. بروز رسانی این روش تماس روش در هر ناظر است که از اجرای رابط مشتق شده است. ناظران می توانید اضافه کنید خود را از طریق روش حذف در شی قابل مشاهده.

این اساسا آن را! من همیشه به عنوان مثال بهترین روش یادگیری / درک بنابراین در اینجا به عنوان مثال من کد بالا را پیدا...

الگوی آبزرور در پی اچ پی

به عنوان مثال من در من ایجاد یک سیستم اخبار (NewsAggregator) می فرستد که از اخبار به روز رسانی ها به عنوان کوچکتر خبر خوان ها. در اینجا اخبار sytem طول می کشد محل موضوع ، قابل مشاهده ، و غیره در حالی که اخبار سایتهای دیگر نگاهی به نقش ناظران و یا گوش فرا دادن.

هنگامی که initialised ناظران می توانید ضمیمه و جدا کردن خود از موضوع را به عنوان مناسب آنها را ببینید. در مثال من ایجاد کرده است سه ناظران ، این اسکن از سرفصل های این موضوع فرستاده و 'فریاد' اخبار در صورت لزوم آن است. سه ناظران به شرح زیر است همراه با شرایط آنها برای اسکن به نام هنگام دریافت عناوین خبری :

  • تنیس '' 'راگبی ، ورزش ناظر :' فوتبال '،
  • اخبار آبزرور : 'سیاست' ، 'مالی' ، 'دولت'
  • مد '،' 'ستاره' ، شایعات بی اساس آبزرور : 'موسیقی' ،

پس از initalising موضوع اضافه کنم اخبار و شایعات بی اساس ناظران و ارسال از بروز رسانی اخبار. بعد از این ورزش ناظر است قبل از ارسال اخبار به روز رسانی بیشتر می فرستاد. در نهایت ناظر شایعات بی اساس است قبل از حذف تیتر اخبار نهایی فرستاد.

سه کلاس مختلف ناظر اجرای رابط آبزرور ، این به آنها رابط روشن / روش که از طریق آن آنها را به روز رسانی دریافت خواهید کرد. ارائه موضوع آنها پیاده سازی رابط ناظر خواهند شد قادر به وصل خود را به. همچنین با این الگوی برنامه نویسی از 'برنامه ای برای پیاده سازی های رابط نیست' نگه می دارد. کلاس NewsAggregator گسترش موضوع کلاس انتزاعی ، که ما را فراهم می کند با سه روش عمومی مورد نیاز :

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

کد دیده می شود در حال اجرا در اینجا ، الگوی آبزرور در پی اچ پی در حال اجرا ، و کد را می توان ، از اینجا دریافت الگوی آبزرور در پی اچ پی کد .

ناظر فیلمنامه

  <؟ پی اچ پی
 / **
  * این پرونده حاوی ناظران
  *
  * @ نویسنده لوید Watkin
  * @ از 2009/12/23
  * /

 موضوع کلاس انتزاعی
 {
	 خلاصه عملکرد addObserver عمومی (آبزرور $ ناظر) ؛
	 خلاصه عملکرد removeObserver عمومی (آبزرور $ ناظر) ؛
	 خلاصه عملکرد updateObservers عمومی ($ newsHeadline) ؛
 }

 / **
  * این موضوع کلاس برای مثال است
  *
  * @ نویسنده لوید Watkin
  * @ از 2009/12/23
  * /
 کلاس ArticleAggregator گسترش موضوع
 {
	 / **
	  * دارای لیستی از ناظران ما
	  *
	  * @ متغیر آرایه
	  * /
	 محافظت $ _observerList = آرایه () ؛

	 / **
	  * روش برای اضافه کردن ناظر
	  *
	  * @ $ متغیر ناظر ناظر
	  * @ باطل بازگشت
	  * /
	 addObserver تابع عمومی (آبزرور $ ناظر)
	 {
		 این $> - _observerList [] = $ ناظر ؛
	 }

	 / **
	  * روش به گزارش ناظر
	  *
	  * @ $ متغیر ناظر ناظر
	  * @ بولی بازگشت
	  * /
	 removeObserver تابع عمومی (آبزرور $ ناظر)
	 {
		 foreach ($ این -> _observerList ع کلید $ => $ ob) {
			 اگر ($ ob == $ ناظر) {
				 ثابت نشده (این $> - _observerList [$ کلیدی]) ؛
				 به راست ؛
			 }
		 }
		 بازگشت کاذب ؛
	 }

	 / **
	  * روش برای به روز رسانی ناظران
	  *
	  * @ $ متغیر رشته newsHeadline
	  * @ باطل بازگشت
	  * /
	 updateObservers تابع عمومی ($ newsHeadline)
	 {
		 foreach ($ این -> _observerList ع $ ob) {
			 $ ob -> بروز رسانی ($ newsHeadline) ؛
		 }
	 }

	 / **
	  * اضافه کردن یک خبر جدید
	  *
	  * @ $ متغیر رشته داستان
	  * @ باطل بازگشت
	  * /
	 addNewsStory تابع عمومی ($ داستان)
	 {
		 اگر (خالی ($ داستان) | |! is_string ($ داستان)) {
			 پرتاب InvalidArgumentException جدید ('انتظار یک خبر!') ؛
		 }
		 این $> - updateObservers ($ داستان) ؛
	 }
 } 

موضوع / فیلمنامه قابل مشاهده

 <پی اچ پی / ** * این پرونده حاوی * * * * @ نویسنده موضوع لوید Watkin * @ * از 2009/12/23 / موضوع کلاس انتزاعی انتزاعی {addObserver تابع عمومی (آبزرور $ ناظر) ؛ انتزاعی removeObserver تابع عمومی (آبزرور $ ناظر ) ؛ انتزاعی updateObservers تابع عمومی ($ newsHeadline) ؛} / ** * این موضوع کلاس برای مثال نویسنده * * * * @ * @ لوید Watkin از 2009/12/23 * / کلاس ArticleAggregator گسترش موضوع {/ ** * را نگه میدارد فهرست * * * * ما از ناظران @ * آرایه متغیر / حفاظت $ _observerList آرایه = () ؛ / ** * روش برای اضافه کردن یک ناظر * * * * @ ور آبزرور $ * بازگشت * ناظر @ باطل / addObserver تابع عمومی (آبزرور $ ناظر) این {$> - _observerList [] = $ ناظر ؛} / ** * روش برای حذف یک ناظر * * * * @ ور آبزرور $ * @ ناظر بازگشت * توانید از عملگرهای منطقی / removeObserver تابع عمومی (آبزرور $ ناظر) {foreach ($ این -> _observerList دلار کلید => $ ob) {اگر ($ ob == $ ناظر) {ثابت نشده (این $> - _observerList [$ کلیدی]) ؛ واقعی بازگشت ؛}} نادرست بازگشت ؛} / ** * روش برای به روز رسانی ناظران * * * * @ متغیر رشته newsHeadline $ * @ * بازگشت از درجه اعتبار ساقط / updateObservers تابع عمومی ($ newsHeadline) {foreach ($ این -> _observerList ع $ ob) {$ ob -> بروز رسانی ($ newsHeadline) ؛}} / ** * اضافه کردن اخبار جدید داستان * * * * @ $ متغیر رشته داستان * @ * بازگشت از درجه اعتبار ساقط / addNewsStory تابع عمومی ($ داستان) (اگر (خالی ($ داستان) | |! is_string ($ داستان)) {پرتاب InvalidArgumentException جدید ('انتظار می رود اخبار داستان ') ؛! این} $> - updateObservers ($ داستان) ؛}} 

کنترل کننده اسکریپت

  <؟ پی اچ پی
 / **
  * آبزرور طراحی الگوی نمونه
  *
  * @ نویسنده لوید Watkin
  * @ از 2009/12/23
  * @ http://www.evilprofessor.co.uk لینک
  * /
 شامل 'observers.php' ؛
 شامل 'subject.php' ؛

 اگر (! خالی ($ _SERVER ['HTTP_USER_AGENT'])) {
     اکو '
 '؛} / / چه هستند که ما انجام شده است؟  اکو 'آبزرور مثال الگو در پی اچ پی.  PHP_EOL ؛ اکو '================================'.  PHP_EOL ؛ / / تنظیم $ موضوع موضوع ما ArticleAggregator = جدید () ؛ اکو -- ArticleAggregator ایجاد شده.  PHP_EOL ؛ / / اضافه کردن برخی از ناظران $ موضوع -> addObserver (جدید NewsObserver ()) ؛ $ موضوع -> addObserver ($ خبرچین جدید = GossipObserver ()) ؛ اکو -- اضافه NewsObverser و GossipObserver.  PHP_EOL.  PHP_EOL ؛ / / بوق ، بوق ، بوق...  اخبار فلش!  اکو 'اخبار کوتاه : مشهور بازیکن راگبی مالی را دوست دارد.  PHP_EOL ؛ اکو '============================================== == '.  PHP_EOL ؛ $ موضوع -> addNewsStory ('مشهور بازیکن راگبی را دوست دارد مالی') ؛ اکو PHP_EOL ؛ اکو -- SportObserver پیدا کرده است و می خواهد از برای پیوستن به گروه '؛ $ addObserver موضوع -> (جدید SportObserver ()) ؛ اکو PHP_EOL .  PHP_EOL ؛ / / بوق ، بوق ، بوق...  اخبار فلش!  اکو 'اخبار کوتاه : دولت messes دوباره!'  .  PHP_EOL ؛ اکو '======================================='.  PHP_EOL ؛ $ موضوع -> addNewsStory ('دولت messes دوباره!') ؛ اکو PHP_EOL ؛ / / بوق ، بوق ، بوق...  اخبار فلش!  اکو 'اخبار کوتاه : مد و فوتبال ترکیب.  PHP_EOL ؛ اکو '======================================='.  PHP_EOL ؛ $ موضوع -> addNewsStory ('مد و فوتبال ترکیب') ؛ اکو PHP_EOL ؛ / / بوق ، بوق ، بوق...  اخبار فلش!  اکو 'نکته ها : موسیقی و سیاست ، چه بعدی؟  .  PHP_EOL ؛ اکو '=========================================='.  ('موسیقی و سیاست ، چه بعدی؟') $ موضوع -> addNewsStory ؛ ؛ PHP_EOL اکو PHP_EOL ؛ / ** * رشد Gossipers خسته ام از اخبار به سرعت و تصمیم گرفته اند * برای جلوگیری از گوش دادن ، با وجود تمام اخبار جالب امروز!  * / اکو -- GossipObserver است حوصله و برگ گروه! '  .  PHP_EOL.  PHP_EOL ؛ $ موضوع -> removeObserver ($ ساعی) ؛ / / بوق ، بوق ، بوق...  اخبار فلش -- به روز رسانی به داستان قبلی!  اکو 'NewsUpdate : مد و فوتبال ترکیب می گوید.  'دولت'.  PHP_EOL ؛ اکو '============================================== == '.  '========='.  PHP_EOL ؛ $ موضوع -> addNewsStory ('مد و فوتبال ترکیب' ، 'می گوید دولت') ؛ اکو PHP_EOL ؛ اگر (! خالی ($ _SERVER ['HTTP_USER_AGENT'])) {اکو ' 

}

3 پاسخ به "پی اچ پی الگوهای طراحی -- الگوی آبزرور"

  1. نذر می گوید :

    سلام ،
    اول ، من انگلیسی بسیار ضعیف است ، سپس
    آیا می توانید به من بگویید که سیستم را که در تصویر چیست؟
    فدورا 12؟
    چیست موضوع؟

  2. نذر می گوید :

    سلام ،
    آیا می توانید به من بگویید که سیستم را که در تصویر چیست؟
    فدورا 12؟
    چیست موضوع؟

پاسخی بنویسید













تم های پانوراما Themocracy

7 بازدید کنندگان آنلاین
5 مهمان ها ، 2 رباتها ، 0 کاربران
حداکثر بازدید کننده امروز : 11 در 02:18 UTC
این ماه : 22 در 2011/08/06 12:30 UTC
این سال : 130 در 28-03-2011 22:40 UTC
تمام زمان حال : 130 در 28-03-2011 10:40 UTC