2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Observer-malli tunnetaan myös nimellä Publish/Subscribe. GOF määrittelee havainnointikuvion seuraavasti: Määritä yksi-moneen riippuvuussuhde objektien välillä, jolloin useat tarkkailijaobjektit voivat keskittyä samaan kohteeseen. Kun objektin tila muuttuu, kaikki siitä riippuvat objektit saavat Ilmoitettu ja päivitetty automaattisesti.
Kuten alla olevasta kuvasta näkyy, tarkkailijakuvio sisältää 5 tyyppistä esinettä.
Katsotaanpa konkreettista toteutusta.
(1) Observer interface Observer.java määrittelee yhtenäisen päivitysrajapinnan update(). Sen lähdekoodi näkyy seuraavassa ohjelmassa.
package behavior.observer;
/**
* @author Minggg
* 观察者接口
*/
public interface Observer {
public void update();
}
(2) Observer-toteutusluokka Observer1.java on tarkkailijan erityinen toteutus, ja sen päivitystoimintoa käytetään merkkijonon tulostamiseen konsoliin. Sen lähdekoodi näkyy seuraavassa ohjelmassa.
package behavior.observer;
/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {
public void update(){
System.out.println("观察者1得到通知!");
}
}
(3) Observer-toteutusluokka Observer2.java on toisen tarkkailijan erityinen toteutus, ja sen päivitystoimintoa käytetään merkkijonon tulostamiseen konsoliin. Sen lähdekoodi näkyy seuraavassa ohjelmassa.
package behavior.observer;
/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {
public void update(){
System.out.println("观察者2得到通知!");
}
}
(4) Havaittu rajapinta Subject.java määrittelee kolme rajapintatoimintoa toimiville tarkkailijoille ja määrittelee tietyn käyttötoiminnon rajapinnan edustamaan sen omia toimintoja. Sen lähdekoodi näkyy seuraavassa ohjelmassa.
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) Havaittu abstrakti luokka AbstractSubject.java tarjoaa vektoriluettelovektorin kaikkien havainnointiobjektien tallentamiseksi ja toteutusfunktioiden kirjoittamiseksi luetteloobjektien käyttöä varten. Sen lähdekoodi näkyy seuraavassa ohjelmassa.
package behavior.observer;
import java.util.Enumeration;
import java.util.Vector;
/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {
private Vector