Berbagi teknologi

Pola Desain - Pola Pengamat

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Inti gagasan pola pengamat

Pola Pengamat juga dikenal sebagai pola Publikasikan/Berlangganan. GOF mendefinisikan pola pengamat sebagai berikut: Mendefinisikan hubungan ketergantungan satu-ke-banyak antar objek, memungkinkan beberapa objek pengamat untuk fokus pada objek yang sama pada waktu yang sama. Ketika keadaan objek berubah, semua objek yang bergantung padanya akan mendapatkan Diberitahu dan diperbarui secara otomatis.
Seperti terlihat pada gambar di bawah, pola pengamat berisi 5 jenis objek.
Masukkan deskripsi gambar di sini

  • Antarmuka targetSubjek: Antarmuka target mendefinisikan tiga antarmuka: tambahkan pengamat melampirkan(), menghapus pengamat melepaskan() dan memberi tahu pengamat notifyObservers(), dan menentukan fungsi operasinya sendiri operasi().
  • Kelas target abstrakAbstractSubject: Kelas ini mendefinisikan vektor objek kumpulan pengamat, yang digunakan untuk menyimpan daftar objek pengamat yang ditambahkan; dan mengimplementasikan tiga fungsi untuk diperbarui: menambahkan pengamat melampirkan(), menghapus pengamat melepaskan() dan memberi tahu pengamat notifyObservers() Daftar ini juga memberi tahu semua objek pengamat untuk memperbarui dirinya sendiri.
  • Kelas target khusus MySubiect: Mewarisi dari kelas target abstrak abstractSubiect, dan menulis fungsi operasi tertentu untuk mengimplementasikan operasi(). Dalam fungsi ini, notifyObservers() dapat dipanggil untuk memberi tahu semua pengamat agar memperbarui dirinya sendiri.
  • Antarmuka pengamat Pengamat: Mendefinisikan antarmuka terpadu update() untuk objek yang perlu diberi tahu ketika kelas target berubah. Saat notifyObservers() dipanggil, fungsi update() akan dipanggil untuk memperbarui dirinya sendiri.
  • pengamat konkrit : Beberapa objek pengamat dapat ditentukan, seperti Observer1 dan Observer2, untuk menulis fungsi pembaruan terpadu. Uji Klien dapat mengimplementasikan pemantauan dengan menambahkan pengamat Pengamat ke kelas Subjek.

Mari kita lihat implementasi spesifiknya.

(1) Antarmuka pengamat Observer.java mendefinisikan antarmuka pembaruan terpadu update(). Kode sumbernya ditunjukkan pada program berikut.

package behavior.observer;


/**
* @author Minggg
* 观察者接口
*/
public interface Observer {

	public void update();
}

(2) Kelas implementasi pengamat Observer1.java adalah implementasi khusus dari pengamat, dan fungsi pembaruannya digunakan untuk mengeluarkan string ke konsol. Kode sumbernya ditunjukkan pada program berikut.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {

	public void update(){ 
		System.out.println("观察者1得到通知!");
	}
}

(3) Kelas implementasi pengamat Observer2.java adalah implementasi khusus dari pengamat lain, dan fungsi pembaruannya digunakan untuk mengeluarkan string ke konsol. Kode sumbernya ditunjukkan pada program berikut.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {

	public void update(){ 
		System.out.println("观察者2得到通知!");
	}
}

(4) Antarmuka yang diamati Subject.java mendefinisikan tiga fungsi antarmuka untuk pengamat operasi, dan mendefinisikan antarmuka fungsi operasi tertentu untuk mewakili fungsinya sendiri. Kode sumbernya ditunjukkan pada program berikut.

package behavior.observer;


/**
* @author Minggg
* 被观察者接口
*/
public interface Subject {

	// 增加观察者
	public void attach(Observer observer);
	// 删除观察者
	public void detach(Observer observer);
	// 通知所有观察者
	public void notifyObservers();
	// 自身的操作接口
	public void operation();
}

(5) Kelas abstrak yang diamati abstractSubject.java menyediakan vektor daftar Vektor untuk menyimpan semua objek pengamat, dan menulis fungsi implementasi untuk mengoperasikan objek daftar. Kode sumbernya ditunjukkan pada program berikut.

package behavior.observer;

import java.util.Enumeration;
import java.util.Vector;


/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {

	private Vector