PHP รูปแบบการออกแบบ -- รูปแบบสังเกตการณ์
ฉันได้รับการอ่าน Head First Design Patterns เมื่อเร็ว ๆ นี้และได้ตัดสินใจที่จะเขียนบางส่วนของรูปแบบการเป็นตัวอย่าง PHP เพื่อประโยชน์ของตัวเอง คนแรกที่ฉันได้ตัดสินใจที่จะรหัสขึ้นเป็น รูปแบบสังเกตการณ์ . คำนิยามอย่างเป็นทางการของสังเกตการณ์รูปแบบคือ :
รูปแบบการสังเกตการณ์ (asynchronous เซตย่อยของ ประกาศ / สมัครสมาชิกรูปแบบ ) เป็น ซอฟแวร์ รูปแบบการออกแบบ ที่ วัตถุ หรือที่เรียกว่าวิชา, รักษาผู้สังเกตการณ์ที่เรียกว่ารายการของตนอยู่ในความอุปการะและแจ้งให้พวกเขาโดยอัตโนมัติของการเปลี่ยนแปลงใด ๆ ของรัฐมักจะโดยการโทร อย่างใดอย่างหนึ่งของพวกเขา วิธี . มันจะใช้ส่วนใหญ่จะใช้การจัดการระบบการกระจายงาน
เป็นระบบเป็นคู่มากขึ้นอย่างอิสระเพื่อให้แน่ใจว่าเมื่อมีเหตุการณ์เกิดขึ้นทุกระบบที่ต้องใช้ความรู้ของการปรับปรุงเหล่านี้จะได้รับแจ้ง ตัวอย่างเช่นการโพสต์ blog, หลังจากบันทึกโพสต์เราอาจจำเป็นต้องปรับปรุงเครื่องมือค้นหา (เช่น Lucene), update sitemap, แท็กของเราผู้ใช้สมัครรับอีเมล ฯลฯ รูปแบบการสังเกตการณ์ช่วยให้นักพัฒนาสามารถเพิ่มผู้ฟังโดยไม่แก้ไขเพิ่มเติมวัตถุที่สังเกตได้ของพวกเขา . โดยการฉีดสังเกตการณ์ (เช่นเครื่องมือค้นหาสังเกตการณ์การปรับปรุงเครื่องกำเนิดไฟฟ้าแผนผังเว็ปไซต์และอื่น ๆ ) ในเรื่อง (โพสต์บล็อกคือระบบการแก้ไข) เราสามารถอนุญาตให้ดำเนินการทั้งหมดโดยไม่จำเป็นต้องปรับปรุงเปลี่ยนแปลงใด ๆ
ก่อนที่รูปแบบการสังเกตการณ์ถูกระบุเคล็ดลับตามปกติจะมีการปรับปรุงวัตถุที่สังเกตได้กับสายเพิ่มเติมในการรหัสในการปรับปรุงระบบที่จำเป็นและลบบรรทัดของรหัสได้ตามต้องการ นี้จะไม่อนุญาตให้มีการเพิ่มและการลบได้อย่างง่ายดายสังเกตการณ์
เรื่องการปรับปรุงทั้งหมดของผู้สังเกตการณ์ผ่านทางวิธีการปรับปรุง วิธีการปรับปรุงนี้จะเรียกวิธีในแต่ละผู้สังเกตการณ์ซึ่งได้มาจากการใช้อินเตอร์เฟซ ผู้สังเกตการณ์สามารถเพิ่มลบตัวเองผ่านทางวิธีการในการสังเกตวัตถุ
ที่เป็นพื้นมัน ผมเคยพบตัวอย่างเป็นวิธีที่ดีที่สุดของการเรียนรู้ / ความเข้าใจเพื่อให้ที่นี่เป็นตัวอย่างของฉัน ... เขียนขึ้น
รูปแบบการสังเกตการณ์ใน PHP
ในตัวอย่างของฉันฉันได้สร้างระบบข่าว (NewsAggregator) ซึ่งจะส่งออกไปยังการปรับปรุงหัวข่าวข่าวฟีดขนาดเล็ก ต่อไปนี้จะทำอันตรายกับระบบข่าวข่าวสถานที่ของเรื่อง, สังเกต, ฯลฯ ในขณะที่ฟีดที่ใช้ฟังบทบาทของผู้สังเกตการณ์หรือ
เมื่อผู้สังเกตการณ์ initialised สามารถแนบและดึงตัวเองจากเรื่องที่พวกเขาเห็นพอดี ในตัวอย่างของฉันฉันได้สร้างขึ้นสามสังเกตการณ์เหล่านี้สแกนพาดหัวส่งออกจากเรื่องและ'ตะโกน'news ถ้าอย่างเหมาะสม สามผู้สังเกตการณ์จะถูกตั้งชื่อด้านล่างนี้ร่วมกับคำที่พวกเขาเมื่อได้รับการสแกนหาหัวข้อข่าว :
- เทนนิส'''รักบี้', กีฬาสังเกตการณ์ :'ฟุตบอล',
- สังเกตการณ์ข่าว :'การเมือง','การเงิน','รัฐบาล'
- แฟชั่น'''คนดัง'สังเกตการณ์ Gossip :'เพลง'
หลังจาก initalising เรื่องฉันจะเพิ่มผู้สังเกตการณ์และข่าวซุบซิบและการส่งออกข่าวประชาสัมพันธ์ หลังจากนี้ผู้สังเกตการณ์กีฬาจะเพิ่มมากขึ้นก่อนที่ข้อมูลข่าวสารจะถูกส่งออก สุดท้ายผู้สังเกตการณ์นินทาจะถูกเอาออกก่อนที่พาดหัวข่าวสุดท้ายจะถูกส่งออก
ผู้สังเกตการณ์ที่แตกต่างกันสามชั้นเรียนใช้อินเตอร์เฟซสังเกตการณ์, นี้จะช่วยให้พวกเขามีอินเตอร์เฟซที่ชัดเจน / วิธีผ่านที่พวกเขาจะได้รับการปรับปรุง ให้พวกเขาใช้อินเตอร์เฟซสังเกตการณ์พวกเขาจะสามารถที่จะแนบตัวเองเรื่อง นอกจากนี้ยังช่วยให้มีกระบวนทัศน์ในการเขียนโปรแกรมของ'โปรแกรมอินเตอร์เฟซการใช้งานไม่ได้' ชั้น NewsAggregator ขยายชั้นเรียนเรื่องนามธรรมซึ่งทำให้เรามีสามวิธีการสาธารณะที่จำเป็น :
- updateObservers ()
- addObserver ()
- 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'';
}



















































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