PHP รูปแบบการออกแบบ -- รูปแบบสังเกตการณ์

โดย Watkin Steven Lloyd , Tuesday 29 ธันวาคม 2009 22:02

ฉันได้รับการอ่าน Head First Design Patterns เมื่อเร็ว ๆ นี้และได้ตัดสินใจที่จะเขียนบางส่วนของรูปแบบการเป็นตัวอย่าง PHP เพื่อประโยชน์ของตัวเอง คนแรกที่ฉันได้ตัดสินใจที่จะรหัสขึ้นเป็น รูปแบบสังเกตการณ์ . คำนิยามอย่างเป็นทางการของสังเกตการณ์รูปแบบคือ :

รูปแบบการสังเกตการณ์ (asynchronous เซตย่อยของ ประกาศ / สมัครสมาชิกรูปแบบ ) เป็น ซอฟแวร์ รูปแบบการออกแบบ ที่ วัตถุ หรือที่เรียกว่าวิชา, รักษาผู้สังเกตการณ์ที่เรียกว่ารายการของตนอยู่ในความอุปการะและแจ้งให้พวกเขาโดยอัตโนมัติของการเปลี่ยนแปลงใด ๆ ของรัฐมักจะโดยการโทร อย่างใดอย่างหนึ่งของพวกเขา วิธี . มันจะใช้ส่วนใหญ่จะใช้การจัดการระบบการกระจายงาน

เป็นระบบเป็นคู่มากขึ้นอย่างอิสระเพื่อให้แน่ใจว่าเมื่อมีเหตุการณ์เกิดขึ้นทุกระบบที่ต้องใช้ความรู้ของการปรับปรุงเหล่านี้จะได้รับแจ้ง ตัวอย่างเช่นการโพสต์ blog, หลังจากบันทึกโพสต์เราอาจจำเป็นต้องปรับปรุงเครื่องมือค้นหา (เช่น Lucene), update sitemap, แท็กของเราผู้ใช้สมัครรับอีเมล ฯลฯ รูปแบบการสังเกตการณ์ช่วยให้นักพัฒนาสามารถเพิ่มผู้ฟังโดยไม่แก้ไขเพิ่มเติมวัตถุที่สังเกตได้ของพวกเขา . โดยการฉีดสังเกตการณ์ (เช่นเครื่องมือค้นหาสังเกตการณ์การปรับปรุงเครื่องกำเนิดไฟฟ้าแผนผังเว็ปไซต์และอื่น ๆ ) ในเรื่อง (โพสต์บล็อกคือระบบการแก้ไข) เราสามารถอนุญาตให้ดำเนินการทั้งหมดโดยไม่จำเป็นต้องปรับปรุงเปลี่ยนแปลงใด ๆ

ก่อนที่รูปแบบการสังเกตการณ์ถูกระบุเคล็ดลับตามปกติจะมีการปรับปรุงวัตถุที่สังเกตได้กับสายเพิ่มเติมในการรหัสในการปรับปรุงระบบที่จำเป็นและลบบรรทัดของรหัสได้ตามต้องการ นี้จะไม่อนุญาตให้มีการเพิ่มและการลบได้อย่างง่ายดายสังเกตการณ์

เรื่องการปรับปรุงทั้งหมดของผู้สังเกตการณ์ผ่านทางวิธีการปรับปรุง วิธีการปรับปรุงนี้จะเรียกวิธีในแต่ละผู้สังเกตการณ์ซึ่งได้มาจากการใช้อินเตอร์เฟซ ผู้สังเกตการณ์สามารถเพิ่มลบตัวเองผ่านทางวิธีการในการสังเกตวัตถุ

ที่เป็นพื้นมัน ผมเคยพบตัวอย่างเป็นวิธีที่ดีที่สุดของการเรียนรู้ / ความเข้าใจเพื่อให้ที่นี่เป็นตัวอย่างของฉัน ... เขียนขึ้น

รูปแบบการสังเกตการณ์ใน PHP

ในตัวอย่างของฉันฉันได้สร้างระบบข่าว (NewsAggregator) ซึ่งจะส่งออกไปยังการปรับปรุงหัวข่าวข่าวฟีดขนาดเล็ก ต่อไปนี้จะทำอันตรายกับระบบข่าวข่าวสถานที่ของเรื่อง, สังเกต, ฯลฯ ในขณะที่ฟีดที่ใช้ฟังบทบาทของผู้สังเกตการณ์หรือ

เมื่อผู้สังเกตการณ์ initialised สามารถแนบและดึงตัวเองจากเรื่องที่พวกเขาเห็นพอดี ในตัวอย่างของฉันฉันได้สร้างขึ้นสามสังเกตการณ์เหล่านี้สแกนพาดหัวส่งออกจากเรื่องและ'ตะโกน'news ถ้าอย่างเหมาะสม สามผู้สังเกตการณ์จะถูกตั้งชื่อด้านล่างนี้ร่วมกับคำที่พวกเขาเมื่อได้รับการสแกนหาหัวข้อข่าว :

  • เทนนิส'''รักบี้', กีฬาสังเกตการณ์ :'ฟุตบอล',
  • สังเกตการณ์ข่าว :'การเมือง','การเงิน','รัฐบาล'
  • แฟชั่น'''คนดัง'สังเกตการณ์ Gossip :'เพลง'

หลังจาก initalising เรื่องฉันจะเพิ่มผู้สังเกตการณ์และข่าวซุบซิบและการส่งออกข่าวประชาสัมพันธ์ หลังจากนี้ผู้สังเกตการณ์กีฬาจะเพิ่มมากขึ้นก่อนที่ข้อมูลข่าวสารจะถูกส่งออก สุดท้ายผู้สังเกตการณ์นินทาจะถูกเอาออกก่อนที่พาดหัวข่าวสุดท้ายจะถูกส่งออก

ผู้สังเกตการณ์ที่แตกต่างกันสามชั้นเรียนใช้อินเตอร์เฟซสังเกตการณ์, นี้จะช่วยให้พวกเขามีอินเตอร์เฟซที่ชัดเจน / วิธีผ่านที่พวกเขาจะได้รับการปรับปรุง ให้พวกเขาใช้อินเตอร์เฟซสังเกตการณ์พวกเขาจะสามารถที่จะแนบตัวเองเรื่อง นอกจากนี้ยังช่วยให้มีกระบวนทัศน์ในการเขียนโปรแกรมของ'โปรแกรมอินเตอร์เฟซการใช้งานไม่ได้' ชั้น NewsAggregator ขยายชั้นเรียนเรื่องนามธรรมซึ่งทำให้เรามีสามวิธีการสาธารณะที่จำเป็น :

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

รหัสสามารถมองเห็นการทำงานที่นี่, สังเกตการณ์รูปแบบใน PHP การเรียกใช้ และรหัสสามารถดาวน์โหลดได้จากที่นี่, สังเกตการณ์รูปแบบใน PHP Code .

Script สังเกตการณ์

  <? PHP
 / **
  * ไฟล์นี้มีผู้สังเกตการณ์
  *
  * @ ผู้เขียน Watkin Lloyd
  * @ ตั้งแต่ 2009/12/23
  * /

 Subject ระดับนามธรรม
 {
	 addObserver ฟังก์ชั่นนามธรรมสาธารณะ (สังเกตการณ์ $ สังเกตการณ์);
	 removeObserver ฟังก์ชั่นนามธรรมสาธารณะ (สังเกตการณ์ $ สังเกตการณ์);
	 นามธรรม updateObservers ทำงานสาธารณะ ($ newsHeadline);
 }

 / **
  * นี่คือชั้นเรียนเรื่องเช่น
  *
  * @ ผู้เขียน Watkin Lloyd
  * @ ตั้งแต่ 2009/12/23
  * /
 ชั้น ArticleAggregator ขยายเรื่อง
 {
	 / **
	  * จัดเก็บรายชื่อของผู้สังเกตการณ์ของเรา
	  *
	  * @ var อาเรย์
	  * /
	 ป้องกัน _observerList อาเรย์ $ = ();

	 / **
	  * วิธีการที่จะเพิ่มผู้สังเกตการณ์
	  *
	  * @ var $ สังเกตการณ์สังเกตการณ์
	  * เป็นโมฆะคืน @
	  * /
	 addObserver ทำงานสาธารณะ (สังเกตการณ์ $ สังเกตการณ์)
	 {
		 _observerList $ this -> [] = ผู้สังเกตการณ์ $;
	 }

	 / **
	  * วิธีที่จะลบผู้สังเกตการณ์
	  *
	  * @ var $ สังเกตการณ์สังเกตการณ์
	  * บูลีนกลับ @
	  * /
	 removeObserver ทำงานสาธารณะ (สังเกตการณ์ $ สังเกตการณ์)
	 {
		 foreach ($ this -> _observerList สำคัญเป็น $ = $> อบ) {
			 if ($ อบ == $ สังเกตการณ์) {
				 ล้างค่า ($ this -> _observerList [$ คีย์]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * วิธีการในการปรับปรุงสังเกตการณ์
	  *
	  * @ var $ newsHeadline สตริง
	  * เป็นโมฆะคืน @
	  * /
	 updateObservers ทำงานสาธารณะ ($ newsHeadline)
	 {
		 foreach ($ this -> _observerList เป็น $ อบ) {
			 update $ อบ -> ($ newsHeadline);
		 }
	 }

	 / **
	  * เพิ่มเรื่องข่าวใหม่
	  *
	  * @ var $ สตริงเรื่องราว
	  * เป็นโมฆะคืน @
	  * /
	 addNewsStory ทำงานสาธารณะ ($ เรื่องราว)
	 {
		 ถ้า (เรื่องราว ($ ว่างเปล่า) | | is_string ($ เรื่องราว)!) {
			 โยน InvalidArgumentException ใหม่ ('คาดว่าจะได้เรื่องข่าว!');
		 }
		 $ this -> updateObservers ($ เรื่อง);
	 }
 } 

Subject / script เด่นชัด

 ? <php / ** * ไฟล์นี้มี * * @ ผู้เขียนเรื่อง Watkin Lloyd * @ ตั้งแต่ 2009/12/23 * / Subject ระดับนามธรรม {addObserver ฟังก์ชั่นนามธรรมสาธารณะ (สังเกตการณ์ $ สังเกตการณ์); removeObserver ฟังก์ชั่นนามธรรมสาธารณะ (สังเกตการณ์ $ สังเกตการณ์ ); นามธรรม updateObservers ทำงานสาธารณะ ($ newsHeadline);} / * ** นี้เป็นชั้นเรียนเรื่องเช่น * * @ ผู้เขียน Lloyd Watkin * 2009/12/23 * @ ตั้งแต่ชั้น / ArticleAggregator Subject {/ ** * ถือขยาย รายชื่อของผู้สังเกตการณ์ของเรา * * @ * อาร์เรย์ var / ป้องกัน _observerList อาเรย์ $ = () / ** * วิธีการที่จะเพิ่มผู้สังเกตการณ์ * * * @ var สังเกตการณ์สังเกตการณ์ $ @ ผลตอบแทน * ฟังก์ชั่นถือเป็นโมฆะ addObserver / สาธารณะ (สังเกตการณ์ $ สังเกตการณ์) {_observerList $ this -> [] ผู้สังเกตการณ์ $ =;} / ** * วิธีที่จะลบสังเกตการณ์ * * * @ var สังเกตการณ์สังเกตการณ์ $ @ ผลตอบแทน * ฟังก์ชั่นบูลีน removeObserver / สาธารณะ (สังเกตการณ์ $ สังเกตการณ์) {foreach ($ this -> คีย์ _observerList เป็น $ => $ อบ) {if ($ อบ == สังเกตการณ์ $) ล้างค่า {(_observerList $ this -> [$ คีย์]) return true;}} return false;} / ** * วิธีการในการปรับปรุงสังเกตการณ์ * * @ var สตริง $ * newsHeadline @ ผลตอบแทน * โมฆะ / updateObservers ทำงานสาธารณะ ($ newsHeadline) {foreach ($ this -> _observerList อบเป็น $) {update $ อบ -> ($ newsHeadline);}} / ** * เพิ่ม เป็นข่าวใหม่ * * @ var สตริง $ @ * เรื่องราวกลับ * ฟังก์ชั่นถือเป็นโมฆะ addNewsStory / สาธารณะ ($ เรื่อง) {if (เรื่องราว ($ ว่างเปล่า) | |! is_string ($ เรื่อง)) {โยน InvalidArgumentException ใหม่ ('คาดว่าจะได้ข่าว เรื่อง');!} $ this -> updateObservers ($ เรื่อง);}} 

สคริปต์ควบคุม

  <? PHP
 / **
  สังเกตการณ์การออกแบบ * ตัวอย่างรูปแบบ
  *
  * @ ผู้เขียน Watkin Lloyd
  * @ ตั้งแต่ 2009/12/23
  * http://www.evilprofessor.co.uk @ ลิงก์
  * /
 รวมถึง'observers.php';
 รวมถึง'subject.php';

 if (! ว่าง ($ ['HTTP_USER_AGENT'] _SERVER)) {
     echo'
  ';
 }

 / / เรากำลังทำอะไร
 echo'ตัวอย่างสังเกตการณ์รูปแบบใน PHP'  PHP_EOL;
 echo '================================'  PHP_EOL;
 / / การตั้งค่าของเราเรื่อง
 subject = $ ArticleAggregator ใหม่ ();
 echo'-- ArticleAggregator สร้าง'  PHP_EOL;

 / / เพิ่มสังเกตการณ์บาง
 $ addObserver เรื่อง -> (ใหม่ NewsObserver ());
 (gossiper $ = new GossipObserver ()) $ เรื่อง -> addObserver;

 echo'-- เพิ่ม NewsObverser & GossipObserver'
	  PHP_EOL  PHP_EOL;

 / / เสียงเตือนเสียงเตือน, เตือน, ...  News Flash!
 echo'Newsflash : เล่นรักบี้รักการเงินชื่อเสียง'  PHP_EOL;
 echo '================================================ '  PHP_EOL;
 addNewsStory $ เรื่อง -> ('เล่นรักบี้รักการเงินชื่อเสียง');
 echo PHP_EOL;

 echo'-- SportObserver ได้พบและต้องการเข้าร่วมกลุ่ม!';
 $ addObserver เรื่อง -> (ใหม่ SportObserver ());
 echo PHP_EOL  PHP_EOL;

 / / เสียงเตือนเสียงเตือน, เตือน, ...  News Flash!
 echo'Newsflash : รัฐบาล messes ขึ้นอีกครั้ง!'  .  PHP_EOL;
 echo '======================================='  PHP_EOL;
 $ เรื่อง -> addNewsStory ('รัฐบาล messes ขึ้นอีกครั้ง!');
 echo PHP_EOL;

 / / เสียงเตือนเสียงเตือน, เตือน, ...  News Flash!
 echo'Newsflash : แฟชั่นและฟุตบอลรวม'  PHP_EOL;
 echo '======================================='  PHP_EOL;
 addNewsStory $ เรื่อง -> ('แฟชั่นและฟุตบอลรวม');
 echo PHP_EOL;

 / / เสียงเตือนเสียงเตือน, เตือน, ...  News Flash!
 echo'Newsflash : ดนตรีและการเมืองอะไรต่อไป'  .  PHP_EOL;
 echo '=========================================='  PHP_EOL;
 ('เพลงและการเมืองอะไรต่อไป') addNewsStory $ เรื่อง ->;
 echo PHP_EOL;

 / **
  * ปากหอยปากปูเติบโตเบื่อข่าวอย่างรวดเร็วและได้ตัดสินใจ
  * เพื่อหยุดฟังแม้จะมีข่าวที่น่าสนใจทั้งหมดในวันนี้!
  * /
 echo'-- GossipObserver เบื่อและออกจากกลุ่ม!'  .
      PHP_EOL  PHP_EOL;
 removeObserver $ เรื่อง -> ($ gossiper);

 / / เสียงเตือนเสียงเตือน, เตือน, ...  News Flash -- Update เพื่อเรื่องราวก่อนหน้านี้!
 echo'NewsUpdate : แฟชั่นและฟุตบอลรวมว่า'
      'รัฐบาล'  PHP_EOL;
 echo '================================================ '
      '========='  PHP_EOL;
 addNewsStory $ เรื่อง -> ('แฟชั่นและฟุตบอลรวม'
                         'รัฐบาล says');
 echo PHP_EOL;

 if (! ว่าง ($ ['HTTP_USER_AGENT'] _SERVER)) {
     echo' 

';

}

3 ตอบไปที่"รูปแบบการออกแบบ PHP -- รูปแบบสังเกตการณ์"

  1. สาบาน says :

    "สวัสดีค่ะ
    First, My ภาษาอังกฤษไม่ดีมากแล้ว
    คุณช่วยบอกฉันว่าเป็นระบบในภาพได้หรือไม่
    Fedora 12?
    ชุดรูปแบบคืออะไร

  2. สาบาน says :

    "สวัสดีค่ะ
    คุณช่วยบอกฉันว่าเป็นระบบในภาพได้หรือไม่
    Fedora 12?
    ชุดรูปแบบคืออะไร

ปล่อยให้ตอบกลับ













ชุดรูปแบบพาโนรามาโดย Themocracy

4 ผู้เข้าชมออนไลน์ขณะนี้
1 แขก, 3 บอ, 0 สมาชิก
สูงสุดวันนี้ผู้เข้าชม : 13 เวลา 11:07 UTC
เดือนนี้ : 22 ที่ 2011/08/06 12:30 UTC
ปีนี้ : 130 ที่ 28-03-2011 10:40 UTC
เวลาทั้งหมด : 130 ที่ 28-03-2011 10:40 UTC