PHP Design Patterns - Pola Observer

Dengan Watkin Lloyd Steven , Selasa 29 Desember 2009 22:02

Aku sudah membaca Kepala Pertama Design Patterns baru-baru ini dan telah memutuskan untuk menulis beberapa pola sebagai contoh PHP untuk keuntungan sendiri. Yang pertama bahwa saya telah memutuskan untuk kode up adalah Pola Observer . Definisi formal Pola Observer adalah:

Pola pengamat (a subset dari asinkron mempublikasikan / berlangganan pola ) adalah sebuah perangkat lunak desain pola di mana sebuah objek , yang disebut subjek, menyimpan daftar tanggungan perusahaan, pengamat disebut, dan memberitahu mereka secara otomatis dari setiap perubahan negara, biasanya dengan menelepon salah satu dari mereka metode . Hal ini terutama digunakan untuk mengimplementasikan sistem penanganan acara terdistribusi.

Ketika sistem menjadi lebih longgar digabungkan memastikan bahwa ketika sebuah peristiwa terjadi semua sistem yang memerlukan pengetahuan update ini diinformasikan. Misalnya, posting blog, setelah menyimpan tulisan kita mungkin perlu memperbarui mesin pencari (misalnya Lucene), update sitemap kita, tag, pengguna berlangganan email, dll Pola pengamat memungkinkan pengembang untuk menambahkan pendengar tambahan tanpa mengedit objek diamati mereka . Dengan menyuntikkan pengamat (yaitu mesin pencari pengamat update, sitemap generator, dll) ke dalam (sistem posting blog yaitu mengedit) subjek kita dapat memungkinkan untuk melakukan semua pembaruan yang diperlukan tanpa perubahan apapun.

Sebelum pola Observer mengidentifikasi trik yang biasa akan memperbarui objek diamati dengan garis tambahan kode untuk memperbarui sistem yang dibutuhkan, dan menghapus baris kode seperti yang diperlukan. Ini tidak memungkinkan untuk dengan mudah menambahkan dan menghapus pengamat.

Subyek update semua pengamat yang melalui metode update. Metode update panggilan suatu metode dalam pengamat setiap yang berasal dari implementasi interface. Pengamat bisa menambahkan menghapus diri melalui metode dalam objek diamati.

Itu dasarnya! Saya selalu menemukan contoh sebagai metode terbaik untuk belajar / pemahaman jadi inilah contoh saya kode Facebook ...

Pola Observer PHP

Dalam contoh saya telah membuat sebuah sistem berita (NewsAggregator) yang mengirimkan headline update berita untuk feed berita yang lebih kecil. Di sini Sytem berita mengambil tempat Subyek, diamati, dll sedangkan berita feed mengambil peran pengamat atau Pendengar.

Setelah pengamat yang diaktifkan dapat melampirkan dan melepaskan diri dari subjek sebagai mereka mau. Dalam contoh saya, saya telah membuat tiga pengamat, ini scan headline dikirim oleh subjek dan 'berteriak' berita jika yang sesuai. Ketiga pengamat bernama bawah bersama dengan syarat mereka scan ketika menerima berita utama:

  • Sport Observer: 'rugby', 'sepakbola', 'tenis'
  • Berita Pengamat: 'politik', 'keuangan', 'pemerintah'
  • Gosip Observer: 'selebriti', 'musik', 'fashion'

Setelah initalising subjek saya menambahkan pengamat berita dan gosip dan mengirimkan update berita. Setelah itu pengamat olahraga ditambahkan sebelum update berita lebih banyak dikirim keluar. Terakhir pengamat gosip dihapus sebelum headline berita akhir dikirim keluar.

Tiga kelas yang berbeda pengamat mengimplementasikan interface Observer, ini memberi mereka antarmuka yang jelas / metode di mana mereka akan menerima update. Asalkan mereka mengimplementasikan interface Observer mereka akan dapat melampirkan diri Subjek. Hal ini juga menjaga dengan paradigma pemrograman 'program untuk antarmuka tidak implementasi'. Kelas NewsAggregator memperluas Subjek kelas abstrak, yang menyediakan kami dengan tiga metode umum yang dibutuhkan:

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

Kode dapat dilihat berjalan di sini, Pengamat Pola PHP Menjalankan , dan kode yang dapat didownload dari sini, Observer Pola PHP Code .

Pengamat Script

  <? Php
 / **
  * File ini berisi pengamat
  *
  * @ Author Lloyd Watkin
  * @ Sejak 2009/12/23
  * /

 kelas abstrak Perihal
 {
	 abstrak addObserver fungsi publik (Observer $ pengamat);
	 abstrak removeObserver fungsi publik (Observer $ pengamat);
	 fungsi abstrak updateObservers umum ($ newsHeadline);
 }

 / **
  * Ini adalah kelas subjek misalnya
  *
  * @ Author Lloyd Watkin
  * @ Sejak 2009/12/23
  * /
 ArticleAggregator kelas meluas Subject
 {
	 / **
	  * Memiliki daftar pengamat kami
	  *
	  * @ Var array
	  * /
	 dilindungi $ _observerList = array ();

	 / **
	  * Metode untuk menambahkan pengamat
	  *
	  * @ Var Pengamat $ pengamat
	  * @ Return void
	  * /
	 fungsi publik addObserver (Observer $ pengamat)
	 {
		 $ This-> _observerList [] = $ pengamat;
	 }

	 / **
	  * Metode untuk menghapus pengamat
	  *
	  * @ Var Pengamat $ pengamat
	  * @ Return boolean
	  * /
	 fungsi publik removeObserver (Observer $ pengamat)
	 {
		 foreach ($ this-> _observerList AS $ key => $ ob) {
			 if ($ ob == $ pengamat) {
				 unset ($ this-> _observerList [$ key]);
				 return true;
			 }
		 }
		 return false;
	 }

	 / **
	  * Metode untuk memperbarui pengamat
	  *
	  * @ Var string $ newsHeadline
	  * @ Return void
	  * /
	 fungsi publik updateObservers ($ newsHeadline)
	 {
		 foreach ($ this-> _observerList AS $ ob) {
			 $ Ob-> update ($ newsHeadline);
		 }
	 }

	 / **
	  * Tambahkan cerita berita baru
	  *
	  * @ Var string $ cerita
	  * @ Return void
	  * /
	 fungsi publik addNewsStory ($ cerita)
	 {
		 if (kosong ($ kisah) | | is_string ($ cerita)!) {
			 melemparkan InvalidArgumentException baru ('Diduga sebuah berita!');
		 }
		 $ This-> updateObservers ($ cerita);
	 }
 } 

Subject Script / diamati

 ? <Php / ** * File ini berisi subjek * * @ author Lloyd Watkin * @ sejak 2009/12/23 * / kelas abstrak Subject {abstrak fungsi addObserver publik (Observer $ pengamat); abstrak fungsi removeObserver publik (Observer $ pengamat ); updateObservers fungsi abstrak umum ($ newsHeadline);} / ** * Ini adalah kelas subjek contoh * * @ author Lloyd Watkin * @ sejak 2009/12/23 * / kelas ArticleAggregator extends Subject {/ ** * Menyimpan daftar * * pengamat kita @ * array var / dilindungi $ _observerList = array (); / ** * Metode untuk menambahkan seorang pengamat * * @ var Observer * pengamat $ return @ * void / fungsi addObserver publik (Observer $ pengamat) _observerList {$ this-> [] pengamat $ =;} / ** * Metode untuk menghapus pengamat * * @ var Observer * $ pengamat @ return * boolean / removeObserver fungsi publik (Observer $ pengamat) {foreach ($ this-> _observerList AS $ key => $ ob) {if ($ ob == $ pengamat) {unset (_observerList $ this-> [$ key]); return true;}} return false;} / ** * Metode untuk memperbarui pengamat * * @ var string * $ newsHeadline @ return void * / updateObservers fungsi publik ($ newsHeadline) {foreach ($ this-> _observerList AS $ ob) {update $ ob-> ($ newsHeadline);}} / ** * Tambahkan sebuah berita baru * * @ var string * $ cerita @ return void * / fungsi addNewsStory umum ($ cerita) {if (kosong ($ kisah) | |! is_string ($ cerita)) {membuang InvalidArgumentException baru ('Diharapkan berita cerita ');!} $ this-> updateObservers ($ cerita);}} 

Controller Script

  <? Php
 / **
  * Pengamat Desain Pola Contoh
  *
  * @ Author Lloyd Watkin
  * @ Sejak 2009/12/23
  * @ Link http://www.evilprofessor.co.uk
  * /
 termasuk 'observers.php';
 termasuk 'subject.php';

 if (kosong ($ ['HTTP_USER_AGENT'] _SERVER)!) {
     echo '
  ';
 }

 / / Apa yang kita lakukan?
 echo 'Pengamat Pola Contoh di PHP'.  PHP_EOL;
 echo'================================'.  PHP_EOL;
 / / Mengatur subyek kami
 $ Subjek ArticleAggregator = new ();
 echo '- ArticleAggregator diciptakan'.  PHP_EOL;

 / / Tambahkan beberapa pengamat
 $ Subjek-> addObserver (baru NewsObserver ());
 (Bigos $ = baru GossipObserver ()) $ subjek-> addObserver;

 echo '- Ditambahkan NewsObverser & GossipObserver'.
	  PHP_EOL.  PHP_EOL;

 / / Bunyi, bip, bip ...  News Flash!
 echo 'NewsFlash: selebriti pemain rugby mencintai keuangan'.  PHP_EOL;
 echo'================================================ '.  PHP_EOL;
 $ Subjek-> addNewsStory ('selebriti pemain rugby mencintai keuangan');
 echo PHP_EOL;

 echo '- SportObserver telah menemukan dan ingin bergabung dengan grup!';
 $ Subjek-> addObserver (baru SportObserver ());
 echo PHP_EOL.  PHP_EOL;

 / / Bunyi, bip, bip ...  News Flash!
 echo 'NewsFlash: pemerintah mengacaukan lagi! "  .  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Subjek-> addNewsStory ('pemerintah mengacaukan lagi!');
 echo PHP_EOL;

 / / Bunyi, bip, bip ...  News Flash!
 echo 'NewsFlash: fashion dan sepakbola menggabungkan'.  PHP_EOL;
 echo'======================================='.  PHP_EOL;
 $ Subjek-> addNewsStory ('fashion dan sepakbola menggabungkan');
 echo PHP_EOL;

 / / Bunyi, bip, bip ...  News Flash!
 echo 'NewsFlash: musik dan politik, apa selanjutnya? "  .  PHP_EOL;
 echo'=========================================='.  PHP_EOL;
 addNewsStory $ subjek-> ('musik dan politik, apa selanjutnya?');
 echo PHP_EOL;

 / **
  * Gossipers tumbuh lelah berita yang sangat cepat dan telah memutuskan
  * Untuk berhenti mendengarkan, meskipun semua berita menarik hari ini!
  * /
 echo '- GossipObserver bosan dan meninggalkan kelompok! "  .
      PHP_EOL.  PHP_EOL;
 $ Subjek-> removeObserver ($ bigos);

 / / Bunyi, bip, bip ...  News Flash - Update ke cerita sebelumnya!
 echo 'NewsUpdate: fashion dan sepakbola menggabungkan kata'.
      'Pemerintah'.  PHP_EOL;
 echo'================================================ '.
      '========='.  PHP_EOL;
 addNewsStory $ subjek-> ('fashion dan sepakbola menggabungkan'.
                         'Mengatakan pemerintah');
 echo PHP_EOL;

 if (kosong ($ ['HTTP_USER_AGENT'] _SERVER)!) {
     echo ' 

';

}

3 Responses to "PHP Pola Desain - Pola Observer"

  1. Sumpah mengatakan:

    Halo,
    Pertama, saya inggris sangat miskin, maka
    Bisakah Anda ceritakan apa sistem dalam gambar?
    fedora 12?
    Apa tema?

  2. Sumpah mengatakan:

    Halo,
    Bisakah Anda ceritakan apa sistem dalam gambar?
    Fedora 12?
    Apa tema?

Tinggalkan Balasan













Panorama Tema oleh Themocracy

9 pengunjung online sekarang
5 tamu, 4 bots, 0 anggota
Max pengunjung hari ini: 13 jam 12:15 UTC
Bulan ini: 26 jam 2011/07/05 00:35 UTC
Tahun ini: 130 pada 28-03-2011 10:40 UTC
Sepanjang waktu: 130 pada 28-03-2011 10:40 UTC