JavaRush /Blog Jawa /Random-JV /Cithakan Observer

Cithakan Observer

Diterbitake ing grup
Minangka Gang of Four nyerat (ngarujuk marang buku "Pola Desain Berorientasi Objek" dening 4 pangembang top-notch), tujuan pola iki yaiku kanggo nemtokake ketergantungan siji-kanggo-akeh antarane obyek kanthi cara sing nalika negara siji owah-owahan obyek, kabeh sing gumantung ing kabar bab iki lan otomatis dianyari. Pola iki uga disebut: Tanggungan (bawahan) utawa Publish-Subscribe (penerbit - pelanggan). Nanging ayo digoleki nganggo tuladhane Gréja Katulik :) Wis pandherekipun ingkang pitados dhateng piwulang gréja punika. Nalika ana dogma anyar (krido wajib) lan liyane katon, wong-wong iki kudu ngerti babagan. Nanging kepiye carane bisa diterangake ing basa pamrograman nggunakake pola iki? 1. Kita duwe "swara pasamuwan" (gereja dhewe utawa Paus nalika nyiarake ex cathedra), yaiku, penyiar utawa subyek tartamtu sing ngumumake warta ing gereja. 2. Wonten ing pasamuwan punika, inggih punika para pengamat ingkang kepéngin mangertos prastawa-prastawa ingkang wigati. Mulane, dina iki bisa uga ana 1,3 milyar umat paroki, lan sesuk bisa uga ana luwih utawa kurang. Lan sampeyan mung kudu menehi kabar marang wong-wong sing ana ing gereja iki (ora perlu ngganggu ateis maneh :). Mangkono, kabeh iki bisa ditulis minangka nderek: Ana pasamuwan sing bakal ngandhani pepanthan sawijining bab soko, kang sampeyan bisa ndhaftar utawa, ing nalisir, ninggalake iku:

public interface Church {
    void registerParishioner(Parishioner parishioner);
    void removeParishioner(Parishioner parishioner);
    void notifyParishioners();
}
Ana Gréja Katulik tartamtu kanthi implementasine metode kasebut, uga warta lan dhaptar wong sing kudu disiarake warta iki:

public class CatholicChurch implements Church {
    private List<parishioner> parishioners;
    private String newsChurch;

    public CatholicChurch() {
        parishioners = new ArrayList<>();
    }

    public void setNewsChurch(String news) {
        this.newsChurch = news;
        notifyParishioners();
    }

    @Override
    public void registerParishioner(Parishioner parishioner) {
        parishioners.add(parishioner);
    }

    @Override
    public void removeParishioner(Parishioner parishioner) {
        parishioners.remove(parishioner);
    }

    @Override
    public void notifyParishioners() {
        for (Parishioner parishioner : parishioners)
            parishioner.update(newsChurch);
    }
}
Ana wong paroki sing bisa mlebu utawa metu saka gereja (kanggo nyederhanakake kode, kita mung ngidini dheweke mlebu :)

public class Parishioner {

    private String name;

    public Parishioner(String name, Church church) {
        this.name = name;
        church.registerParishioner(this);
    }

    void update(String newsChurch) {
        System.out.println(name + "узнал новость: " + newsChurch);
    }
}
Dadi, iki bakal ditindakake:

public class Main {
    public static void main(String[] args) {
        var catholicChurch = new CatholicChurch();

        new Parishioner("Мартин Лютер", catholicChurch);
        new Parishioner("Жан Кальвин", catholicChurch);

        catholicChurch.setNewsChurch("Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года");
    }
}
lan asil saka program:

Мартин Лютер узнал новость: Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года
Жан Кальвин узнал новость: Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года
Sing. Sanalika warta katon ing pasamuwan, saben wong sing ana ing susunan anggota pasamuwan iki bakal dilaporake babagan iki. Apa kekurangan saka implementasine iki: 1. Kaping pisanan, antarmuka ing ngendi sampeyan bisa ndhaftar lan nampa kabar bisa uga ora mung gereja iki (bisa uga dibutuhake). Mulane, iku bakal bisa kanggo langsung mindhah iki menyang antarmuka Observable kapisah. 2. Padha bisa rampung karo parishioners pasamuwan, yaiku, mindhah cara nganyari menyang antarmuka kapisah lan ngleksanakake kanggo parishioner dikarepake. Banjur cara iki bakal bisa digunakake ing umum ora dening paroki Gréja Katulik, nanging, contone, dening wong-wong sing manggon ing elves (tegese "Road to Unicorn" gerakan). Sing. nggawe antarmuka Observer kanthi cara nganyari. Apa sing bakal kelakon ing pungkasan:

interface Observable {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

public class CatholicChurch implements Observable {
    private List<observer> parishioners;
    private String newsChurch;

    public CatholicChurch() {
        parishioners = new ArrayList<>();
    }

    public void setNewsChurch(String news) {
        this.newsChurch = news;
        notifyObservers();
    }

    @Override
    public void registerObserver(Observer o) {
        parishioners.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        parishioners.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (Observer o : parishioners)
            o.update(newsChurch);
    }
}

interface Observer {
    void update (String news);
}

public class Parishioner implements Observer {
    private String name;

    public Parishioner(String name, Observable o) {
        this.name = name;
        o.registerObserver(this);
    }

    @Override
    public void update(String news) {
        System.out.println(name + " узнал новость: " + news);
    }
}
Mangkono: Kita wis "weakened sambungan" antarane pasamuwan lan parishioners, kang alamiah apik mung ing program :) Subyek (Gréja Katolik) wis mung dhaftar pamireng (paroki) lan nalika nampa warta (owah-owahan), siaran warta iki. marang pamirenge. Saiki sampeyan bisa nggawe entitas liyane (contone, gereja Protestan) lan nyebarake kabar kasebut menyang pamireng "sampeyan". Sampeyan uga kudu nyathet yen data kelas 2 (luwih tepat, kelas Observable lan antarmuka Observer) kasedhiya ing paket java.util java, nanging saiki wis Deprecation karo java 9 (https://docs.oracle. com/en/java/javase/15/ docs/api/java.base/java/util/Observable.html): Deprecated. Kelas iki lan antarmuka Observer wis ora digunakake. Model acara sing didhukung dening Observer lan Observable cukup winates, urutan kabar sing dikirim dening Observable ora ditemtokake, lan owah-owahan negara ora ana ing korespondensi siji-kanggo-siji karo kabar. Kanggo model acara sing luwih sugih, coba gunakake paket java.beans. Kanggo olahpesen sing dipercaya lan diurutake ing antarane utas, coba gunakake salah sawijining struktur data bebarengan ing paket java.util.concurrent. Kanggo pemrograman gaya aliran reaktif, deleng Flow API. Mulane ora perlu nggunakake. Lan sampeyan bisa nggunakake liyane tinimbang, nanging inti saka pola ora bakal ngganti. Contone, ayo nyoba nggunakake PropertyChangeListener (supaya ora nulis kelas sing ora perlu sing wis ditulis) saka paket java.beans. Ayo ndeleng kepiye: kelas subjek:

public class CatholicChurch {
    private String news;
    // используя support мы можем добавлять or удалять наших прихожан (слушателей)
    private PropertyChangeSupport support;

    public CatholicChurch() {
        support = new PropertyChangeSupport(this);
    }
    public void addPropertyChangeListener(PropertyChangeListener pcl) {
        support.addPropertyChangeListener(pcl);
    }

    public void removePropertyChangeListener(PropertyChangeListener pcl) {
        support.removePropertyChangeListener(pcl);
    }

    public void setNews(String value) {
        support.firePropertyChange("news", this.news, value);
        this.news = value;
    }
}
lan kelas pamireng:

public class Parishioner implements PropertyChangeListener {
    private String name;

    public Parishioner(String name) {
        this.name = name;
    }

    public void propertyChange(PropertyChangeEvent evt) {
        this.setNews((String) evt.getNewValue());
    }

    public void setNews(String news) {
        System.out.println(name + " узнал новость: " + news);
    }
}
Yen kita nglakokake kode ing ngisor iki:

public static void main(String[] args) {
    CatholicChurch observable = new CatholicChurch();

    observable.addPropertyChangeListener(new Parishioner("Мартин Лютер"));
    observable.addPropertyChangeListener(new Parishioner("Жан Кальвин"));

    observable.setNews("Дева Мария имеет непорочное зачатие... булла Ineffabilis Deus... 8 декабря 1854 года Папа Пий IX");
    observable.setNews("Папа непогрешим... не всегда конечно, а только когда транслирует учение церкви ex cathedra... Первый Ватиканский собор 1869 год");
}
Kita entuk asil ing ngisor iki:
Martin Luther sinau warta: Virgin Mary iku saka Immaculate Conception... bull Ineffabilis Deus... 8 Desember 1854 Paus Pius IX John Calvin sinau warta: Virgin Mary iku saka Immaculate Conception... Bull Ineffabilis Deus ... 8 Desember 1854 Paus Pius IX Martin Luther sinau warta: Paus iku infallible ... ora mesthi mesthi, nanging mung nalika nyebarake piwulang saka pasamuwan ex cathedra ... Konsili Vatikan pisanan 1869 John Calvin sinau warta: Paus iku infallible ... ora mesthi mesthi, nanging mung nalika siaran piwulang saka pasamuwan ex cathedra ... First Vatikan Council 1869
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION