JavaRush /Java Blog /Random-TK /Synçy şablony

Synçy şablony

Toparda çap edildi
Dört toparyň ýazyşy ýaly (4 sany ýokary derejeli işläp düzüjiniň “Obýekte gönükdirilen dizaýn nagyşlary” kitabyna salgylanýar), bu nagşyň maksady obýektleriň arasynda bir-birine baglylygy kesgitlemek, haçan bir obýektiň ýagdaýy üýtgeýär, oňa bagly bolanlaryň hemmesine bu barada habar berilýär we awtomatiki usulda täzelenýär. Bu nagyş şeýle hem atlandyrylýar: baglylar (gol astyndakylar) ýa-da Publish-Subscribe (neşir ediji - abonent). Letöne geliň, katolik buthanasynyň mysalyny ulanyp anyklamaga synanyşalyň :) Bu ybadathananyň taglymatlaryna ynanýan yzarlaýjylary bar. Haçan-da islendik täze dogmalar (hökmany ynançlar) we has köp peýda bolanda, bu adamlar olar hakda bilmelidirler. Thisöne bu nagşy ulanyp, programmirleme dilinde muny nädip suratlandyryp bolar? 1. Bizde "ybadathananyň sesi" bar (öňki ybadathanany efire berende ybadathananyň özi ýa-da Rim papasy), ýagny ýygnakda habar berýän belli bir ýaýlymçy ýa-da mowzuk bar. 2. Bu ybadathananyň ybadathanalary, ýagny möhüm wakalardan habarly bolmak isleýän käbir synçylar bar. Şoňa görä-de, bu gün 1,3 milliard parişioner bolup biler, ertir bolsa köp ýa-da az bolup biler. Diňe bu ýygnakdakylara habar bermeli (ýene ateistleri biynjalyk etmegiň zerurlygy ýok :). Şeýlelik bilen, bularyň hemmesini şeýle beýan edip bolar: Sürüsine bellige alyp boljak ýa-da tersine goýup boljak bir zat hakda sürüsine habar berjek ýygnak bar:
public interface Church {
    void registerParishioner(Parishioner parishioner);
    void removeParishioner(Parishioner parishioner);
    void notifyParishioners();
}
Bu usullaryň durmuşa geçirilmegi bilen belli bir katolik buthanasy, täzelikler we bu habary ýaýratmaly adamlaryň sanawy bar:
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);
    }
}
Ybadathana girip ýa-da çykyp bilýän bir parişioner bar (koduny ýönekeýleşdirmek üçin, oňa diňe girmäge rugsat bereris :)
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);
    }
}
Şoňa laýyklykda, bu nähili işlär:
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 года");
    }
}
we programmanyň netijesi:
Мартин Лютер узнал новость: Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года
Жан Кальвин узнал новость: Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года
Bular. Ybadathanada habar peýda bolansoň, bu ybadathananyň hasaba alnan agzalarynyň hataryna girenleriň hemmesine habar beriler. Bu durmuşa geçirmegiň kemçilikleri näme: 1. Ilki bilen, hasaba alynyp we habar alyp boljak interfeýs diňe bir bu ybadathana degişli bolup bilmez (bu zerur bolup biler). Şonuň üçin muny derrew aýratyn Synlap boljak interfeýsine geçirmek mümkin. 2. Ybadathananyň wekilleri bilen hem edil şonuň ýaly edilip bilner, ýagny täzeleniş usulyny aýratyn interfeýsine geçirip, islenýän parişioner üçin durmuşa geçiriň. Soňra bu usul, umuman, katolik buthanasynyň dindarlary tarapyndan däl-de, mysal üçin elfleriň barlygynda (“iceke-täk ýol” hereketini aňladýan) ulanyp bilerler. Bular. täzeleniş usuly bilen Synçy interfeýsini dörediň. Ahyrynda näme bolar:
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);
    }
}
Şeýlelik bilen: Diňe programmirlemekde oňat bolan buthana bilen ybadathanalaryň arasynda "baglanyşygy gowşadyk" :) Bu mowzukda (katolik buthanasynda) diňe diňleýjileriň (parişionerleriň) sanawy bar we habarlar (üýtgeşmeler) alnanda bu habary ýaýradýar; diňleýjilerine. Indi başga bir guramany döredip bilersiňiz (mysal üçin, Protestant ybadathanasy) we täzelikleri “diňleýjilere” ýaýradyp bilersiňiz. Şeýle hem java.util java paketinde 2-nji synp maglumatlarynyň (has takygy, Syn edilip bilinýän synp we Synçy interfeýsi) bardygyny göz öňünde tutmalysyňyz, emma indi olar java 9 (https://docs.oracle) bilen könelişýär. com / en / java / javase / 15 / docs / api / java.base / java / util / Observable.html): Könelişen. Bu synp we Synçy interfeýsi köneldi. “Observer” we “Observable” tarapyndan goldanýan hadysanyň modeli gaty çäklidir, “Observable” tarapyndan iberilýän habarnamalaryň tertibi kesgitlenmedik we döwlet üýtgeşmeleri habarnamalar bilen ýeke-täk hat alyşmaýar. Has baý waka modeli üçin java.beans paketini ulanmagy göz öňünde tutuň. Saplaryň arasynda ygtybarly we sargyt edilen habarlaşma üçin java.util.concurrent paketindäki yzygiderli maglumat gurluşlaryndan birini ulanmagy göz öňünde tutuň. Reaktiw akymlar stil programmirlemek üçin “Flow API” -e serediň. Şonuň üçin olary ulanmagyň zerurlygy ýok. Munuň ýerine başgalary ulanyp bilersiňiz, ýöne nagşyň düýp manysy üýtgemez. Mysal üçin, java.beans paketinden PropertyChangeListener (eýýäm ýazylan goşmaça synplary ýazmazlyk üçin) ulanmaga synanyşalyň. Onuň nähili boljakdygyny göreliň: mowzuk synpy:
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;
    }
}
we diňleýji synpy:
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);
    }
}
Aşakdaky kody ýerine ýetirsek:
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 год");
}
Aşakdaky netijäni alýarys:
Martin Lýuter bu habary öwrendi: Merýem Merýem tämiz düşünjedir ... öküz Ineffabilis Deus ... 1854-nji ýylyň 8-nji dekabrynda Rim papasy Piýus IX Jon Kalwin bu habary öwrendi: Merýem Merýem düşünjesiz ... Bull Ineffabilis Deus ... 1854-nji ýylyň 8-nji dekabr habar: Rim papasy ýalňyş ... elmydama elbetde däl, diňe ybadathananyň öňki ybadathanasynyň taglymatyny ýaýlyma bereninde ... Ilkinji Watikan Geňeşi 1869
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION