Corak pemerhati
Apabila terdapat hubungan satu-dengan-banyak antara objek, Corak Pemerhati digunakan. Contohnya, apabila objek diubah suai, objek bergantungnya dimaklumkan secara automatik. Corak pemerhati ialah corak tingkah laku.
Pengenalan
Niat: Tentukan hubungan pergantungan satu-ke-banyak antara objek Apabila keadaan objek berubah, semua objek yang bergantung padanya akan Dimaklumkan dan dikemas kini secara automatik.
Terutamanya menyelesaikan: Masalah memberitahu objek lain tentang perubahan status satu objek, dan mengambil kira kemudahan penggunaan dan gandingan rendah untuk memastikan tahap kerjasama yang tinggi.
Bila hendak digunakan: Apabila keadaan objek (objek sasaran) berubah, semua objek bergantung (objek pemerhati) akan dimaklumkan dan pemberitahuan siaran akan dibuat.
Cara menyelesaikan: Menggunakan teknologi berorientasikan objek, kebergantungan ini boleh dilemahkan.
Kod kunci: Terdapat ArrayList dalam kelas abstrak untuk menyimpan pemerhati.
Contoh permohonan: 1 Semasa lelongan, pelelong memerhatikan bidaan tertinggi dan kemudian memberitahu pembida lain untuk membida. 2. Dalam Perjalanan ke Barat, Wukong meminta Bodhisattva untuk menyerahkan Budak Merah Bodhisattva memercikkan air ke tanah dan menarik kura-kura ini adalah pemerhatinya.
Kelebihan: 1. Pemerhati dan yang diperhatikan digabungkan secara abstrak. 2. Wujudkan mekanisme pencetus.
Kelemahan: 1 Jika objek yang diperhatikan mempunyai banyak pemerhati secara langsung dan tidak langsung, ia akan mengambil banyak masa untuk memberitahu semua pemerhati. 2. Jika terdapat pergantungan kitaran antara pemerhati dan sasaran pemerhatian, sasaran pemerhatian akan mencetuskan panggilan kitaran antara mereka, yang boleh menyebabkan sistem ranap. 3. Mod pemerhati tidak mempunyai mekanisme yang sepadan untuk membolehkan pemerhati mengetahui bagaimana objek sasaran yang diperhatikan telah berubah, tetapi hanya untuk mengetahui bahawa sasaran pemerhatian telah berubah.
Senario penggunaan: 1 Terdapat kaedah biasa untuk berbilang subkelas, dan logiknya adalah sama. 2. Kaedah penting dan kompleks boleh dianggap sebagai kaedah templat.
Nota: 1. JAVA sudah mempunyai kelas sokongan untuk corak pemerhati. 2. Elakkan rujukan pekeliling. 3. Jika dilaksanakan secara berurutan, ralat pemerhati akan menyebabkan sistem menjadi beku, dan kaedah tak segerak biasanya digunakan.
Pelaksanaan
Corak pemerhati menggunakan tiga kelas: Subjek, Pemerhati dan Klien. Objek Subjek mempunyai kaedah untuk mengikat pemerhati dan menyahikat pemerhati daripada objek Klien. Kami mencipta kelas Subjek, kelas abstrak Pemerhati dan kelas entiti yang memanjangkan kelas abstrak Pemerhati.
ObserverPatternDemo, kelas demo kami menggunakan Subjek dan objek kelas entiti untuk menunjukkan corak pemerhati.
Langkah 1
Buat kelas Subjek.
Subject.java
import java.util.ArrayList; import java.util.List; public class Subject { private List<Observer> observers = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer){ observers.add(observer); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } }
Langkah 2
Buat kelas Observer.
Observer.java
public abstract class Observer { protected Subject subject; public abstract void update(); }
Langkah 3
Buat kelas pemerhati entiti.
BinaryObserver.java
public class BinaryObserver extends Observer{ public BinaryObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); } }
OctalObserver.java
public class OctalObserver extends Observer{ public OctalObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); } }
HexaObserver.java
public class HexaObserver extends Observer{ public HexaObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); } }
Langkah 4
Gunakan Subjek dan objek pemerhati entiti.
ObserverPatternDemo.java
public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); new HexaObserver(subject); new OctalObserver(subject); new BinaryObserver(subject); System.out.println("First state change: 15"); subject.setState(15); System.out.println("Second state change: 10"); subject.setState(10); } }
Langkah 5
Sahkan output.
First state change: 15 Hex String: F Octal String: 17 Binary String: 1111 Second state change: 10 Hex String: A Octal String: 12 Binary String: 1010