Các mẫu thiết kế PHP - Observer Pattern
Tôi đã đọc Head First Design Patterns gần đây và đã quyết định viết một số trong những mô hình làm ví dụ PHP cho lợi ích của riêng tôi. Người đầu tiên mà tôi đã quyết định mã lên là mẫu Observer . Định nghĩa chính thức của mẫu Observer là:
Các mô hình quan sát (một tập hợp con của không đồng bộ xuất bản / đăng ký mẫu ) là một phần mềm thiết kế mô hình trong đó một đối tượng , được gọi là các chủ đề, duy trì một danh sách các người phụ thuộc của nó, quan sát được gọi, và thông báo cho chúng tự động của bất kỳ thay đổi trạng thái, thường bằng cách gọi một trong số họ phương pháp . Nó được sử dụng chủ yếu để thực hiện các sự kiện hệ thống xử lý phân tán.
Khi hệ thống trở nên lỏng lẻo và đảm bảo rằng khi một sự kiện xảy ra tất cả các hệ thống đó có yêu cầu kiến thức về các bản cập nhật được thông báo. Ví dụ, một bài viết trên blog, sau khi tiết kiệm một bài viết chúng tôi có thể cần phải cập nhật một công cụ tìm kiếm (ví dụ Lucene), cập nhật bản đồ, thẻ của chúng tôi, người dùng email đăng ký, vv Các mô hình quan sát cho phép các nhà phát triển bổ sung thêm người nghe mà không chỉnh sửa đối tượng quan sát của họ . Bằng cách tiêm các quan sát (tức là một người quan sát tìm kiếm cập nhật động cơ, một máy phát điện đồ, vv) vào một (hệ thống blog tức là chỉnh sửa bài viết) đề chúng ta có thể cho phép nó để thực hiện tất cả các bản cập nhật cần thiết mà không có bất kỳ thay đổi.
Trước khi mẫu Observer đã được xác định lừa thông thường sẽ được cập nhật các đối tượng quan sát được với một dòng bổ sung của mã để cập nhật hệ thống yêu cầu, và loại bỏ các dòng mã theo yêu cầu. Điều này không cho phép dễ dàng bổ sung và loại bỏ các quan sát viên.
Các chủ đề cập nhật tất cả các quan sát của nó thông qua một phương pháp cập nhật. Phương pháp này gọi là một phương pháp cập nhật trong mỗi người quan sát mà có nguồn gốc từ thực hiện một giao diện. Các nhà quan sát có thể thêm một loại bỏ chính mình thông qua các phương thức trong các đối tượng quan sát được.
Đó là về cơ bản nó! Tôi luôn luôn tìm thấy một ví dụ là phương pháp tốt nhất của việc học / hiểu biết như vậy ở đây là một ví dụ mã hoá lên của tôi ...
Observer Pattern trong PHP
Trong ví dụ của tôi, tôi đã tạo ra một hệ thống thông tin (NewsAggregator) được gửi ra bản cập nhật tiêu đề tin tức cho bản tin nhỏ hơn. Ở đây, sytem tin tức mất vị trí của các Chủ đề, Quan sát, vv trong khi đó tin tức nguồn cấp dữ liệu có vai trò của các quan sát viên hoặc người nghe.
Sau khi quan sát khởi tạo có thể đính kèm và tách mình khỏi vấn đề này khi họ thấy phù hợp. Trong ví dụ của tôi, tôi đã tạo ra ba quan sát, những quét các tiêu đề gửi ra theo chủ đề và "hét" những tin tức nếu thích hợp của mình. Ba quan sát được đặt tên dưới đây cùng với các điều khoản mà họ quét khi nhận được tin tức tiêu đề:
- Thể thao Observer: 'rugby', 'bóng đá', 'quần vợt'
- Tin tức Observer: 'chính trị', 'tài chính', 'chính phủ
- Gossip Observer: "người nổi tiếng", "âm nhạc", "thời trang"
Sau khi initalising chủ đề tôi thêm các nhà quan sát tin tức và tin đồn và gửi một cập nhật tin tức. Sau này, các quan sát viên thể dục thể thao được thêm vào trước khi cập nhật tin tức được gửi ra ngoài. Cuối cùng các nhà quan sát tin đồn được lấy ra trước khi một tiêu đề tin tức cuối cùng được gửi ra ngoài.
Ba lớp học quan sát khác nhau thực hiện các quan sát giao diện, điều này tạo cho họ một giao diện rõ ràng / phương pháp mà qua đó họ sẽ nhận được cập nhật. Miễn là họ thực hiện các giao diện Observer họ sẽ có thể bám vào đề này. Điều này cũng giữ với các mô hình lập trình của chương trình với giao diện không hiện thực ". Lớp NewsAggregator mở rộng đề lớp trừu tượng, cung cấp cho chúng tôi với ba công phương pháp cần thiết:
- updateObservers ()
- addObserver ()
- removeObserver ()
Mã này có thể được nhìn thấy chạy ở đây, Observer Pattern trong PHP chạy , và mã có thể được tải về từ đây, Observer Pattern trong PHP Mã .
Observer Script
<? Php / ** * File này có chứa các quan sát viên * * @ Tác giả Lloyd Watkin * @ Từ 2009/12/23 * / lớp trừu tượng Chủ đề { trừu tượng công chức năng addObserver (Observer $ quan sát); trừu tượng công chức năng removeObserver (Observer $ quan sát); trừu tượng công chức năng updateObservers ($ newsHeadline); } / ** * Đây là lớp đối tượng ví dụ * * @ Tác giả Lloyd Watkin * @ Từ 2009/12/23 * / Chủ đề mở rộng lớp ArticleAggregator { / ** * Giữ một danh sách các nhà quan sát của chúng tôi * * @ Var array * / bảo vệ $ _observerList = array (); / ** * Phương pháp để thêm một người quan sát * * @ Var $ quan sát Observer * @ Trả lại void * / chức năng công cộng addObserver (Observer $ quan sát) { $ This-> _observerList [] = $ quan sát; } / ** * Phương pháp để loại bỏ một quan sát viên * * @ Var $ quan sát Observer * @ Trả lại boolean * / chức năng công cộng removeObserver (Observer $ quan sát) { foreach ($ this-> _observerList AS $ key => $ ob) { if ($ ob == $ quan sát) { unset ($ this-> _observerList [$ key]); trả về true; } } trả về false; } / ** * Phương pháp để cập nhật các quan sát viên * * @ Var chuỗi $ newsHeadline * @ Trả lại void * / chức năng công cộng updateObservers ($ newsHeadline) { foreach ($ this-> _observerList AS $ ob) { $ Ob-> cập nhật ($ newsHeadline); } } / ** * Thêm một câu chuyện tin tức mới * * @ Var chuỗi câu chuyện $ * @ Trả lại void * / chức năng công cộng addNewsStory (câu chuyện) { if (trống (câu chuyện) | | is_string (câu chuyện)!) { ném InvalidArgumentException mới ("Dự kiến một câu chuyện tin tức! '); } $ This-> updateObservers (câu chuyện); } }
Chủ đề / Quan sát Script
? <Php / ** * File này có chứa các * * môn @ tác giả Lloyd Watkin * @ từ 2009/12/23 * / lớp trừu tượng trừu tượng đề {chức năng công cộng addObserver (Observer $ quan sát); trừu tượng công chức năng removeObserver (Observer $ quan sát ); trừu tượng updateObservers chức năng công cộng ($ newsHeadline);} / ** * Đây là lớp chủ đề cho các ví dụ * * @ tác giả Lloyd Watkin * @ từ 2009/12/23 * / lớp ArticleAggregator mở rộng đề {/ ** * Giữ một danh sách các nhà quan sát của chúng tôi * * @ var array * / bảo vệ $ _observerList = array (); / ** * Phương pháp để thêm một người quan sát * * @ var Observer $ quan sát * @ trả lại void * / public chức năng addObserver (Observer $ quan sát) {$ this-> _observerList [] = quan sát $;} / ** * Phương pháp để loại bỏ một quan sát viên * * @ var Observer $ quan sát * @ trả lại boolean * / public chức năng removeObserver (Observer $ quan sát) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ quan sát) {unset ($ this-> _observerList [$ key]); trả về true;}} return false;} / ** * Phương pháp để cập nhật các quan sát viên * * @ var chuỗi $ newsHeadline * @ trả lại void * / updateObservers chức năng công cộng ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {$ ob-> cập nhật ($ newsHeadline);}} / ** * Thêm một tin tức mới * câu chuyện * @ var chuỗi $ câu chuyện * @ trả lại void * / public chức năng addNewsStory (truyện) {nếu (trống (câu chuyện) | |! is_string (câu chuyện)) {ném InvalidArgumentException mới ('Đợi tin Câu chuyện ');!} $ this-> updateObservers (câu chuyện);}} Điều khiển Script
<? Php / ** * Thiết kế Observer Pattern Ví dụ * * @ Tác giả Lloyd Watkin * @ Từ 2009/12/23 * @ Link http://www.evilprofessor.co.uk * / bao gồm 'observers.php'; bao gồm 'subject.php'; if (empty ($ ['HTTP_USER_AGENT'] _SERVER)!) { echo ''; } / / Chúng tôi đang làm gì? echo 'Observer Pattern Ví dụ trong PHP. PHP_EOL; echo'================================'. PHP_EOL; / / Thiết lập các chủ đề của chúng tôi $ Môn = mới ArticleAggregator (); echo '- ArticleAggregator tạo ra'. PHP_EOL; / / Thêm một số nhà quan sát $ Môn-> addObserver (mới NewsObserver ()); $ Môn-> addObserver ($ gossiper = mới GossipObserver ()); echo '- Đăng NewsObverser & GossipObserver'. PHP_EOL. PHP_EOL; / / Beep, bíp, bíp ... Tin tức Flash! echo 'đặt biệt: người nổi tiếng chơi bóng bầu dục yêu thương tài chính ". PHP_EOL; echo'================================================ '. PHP_EOL; $ Môn-> addNewsStory (cầu thủ bóng bầu dục nổi tiếng thích tài chính '); echo PHP_EOL; echo '- SportObserver đã phát hiện ra và muốn tham gia vào nhóm! "; $ Môn-> addObserver (mới SportObserver ()); echo PHP_EOL. PHP_EOL; / / Beep, bíp, bíp ... Tin tức Flash! echo 'đặt biệt: chính phủ messes lên một lần nữa! " . PHP_EOL; echo'======================================='. PHP_EOL; $ Môn-> addNewsStory (của chính phủ messes lên một lần nữa! '); echo PHP_EOL; / / Beep, bíp, bíp ... Tin tức Flash! echo 'đặt biệt: kết hợp thời trang và bóng đá. PHP_EOL; echo'======================================='. PHP_EOL; $ Môn-> addNewsStory ('thời trang và bóng đá kết hợp'); echo PHP_EOL; / / Beep, bíp, bíp ... Tin tức Flash! echo 'đặt biệt: âm nhạc và chính trị, những gì tiếp theo? " . PHP_EOL; echo'=========================================='. PHP_EOL; $ Môn-> addNewsStory ('âm nhạc và chính trị, những gì tiếp theo?'); echo PHP_EOL; / ** * Gossipers phát triển mệt mỏi của tin tức rất nhanh chóng và có quyết định * Ngừng lắng nghe, mặc dù tất cả tin tức thú vị ngày hôm nay! * / echo '- GossipObserver là chán và rời khỏi nhóm! " . PHP_EOL. PHP_EOL; $ Môn-> removeObserver ($ gossiper); / / Beep, bíp, bíp ... Tin vắn - Thông tin cho một câu chuyện trước đó! echo 'NewsUpdate: kết hợp thời trang và bóng đá nói. Của chính phủ. PHP_EOL; echo'================================================ '. '========='. PHP_EOL; $ Môn-> addNewsStory ('thời trang và bóng đá kết hợp'. 'Nói rằng chính phủ'); echo PHP_EOL; if (empty ($ ['HTTP_USER_AGENT'] _SERVER)!) { echo '';
}



















































Xin chào,
Trước tiên, tiếng Anh của tôi rất nghèo, sau đó
Bạn có thể cho tôi biết hệ thống trong các hình ảnh là gì?
Fedora 12?
chủ đề là gì?
Xin chào,
Bạn có thể cho tôi biết hệ thống trong các hình ảnh là gì?
Fedora 12?
chủ đề là gì?
fedora của nó 11 với KDE áp dụng. Glasslooks chủ đề gì đó.