JavaRush /Блоги Java /Random-TG /Шаблон нозир

Шаблон нозир

Дар гурӯҳ нашр шудааст
Тавре ки гурӯҳи чаҳоргона менависад (бо истинод ба китоби "Тарроҳии ба an object нигаронидашуда" аз ҷониби 4 таҳиягари олӣ), ҳадафи ин намуна ин муайян кардани вобастагии як ба бисёр байни an objectҳо мебошад, ки вақте ки ҳолати як an object тағир меёбад, ҳамаи онҳое, ки ба он вобастаанд, дар ин бора огоҳ карда мешаванд ва ба таври худкор нав карда мешаванд. Ин намуна инчунин номида мешавад: Тобеён (тобеъон) ё Интишор-Обуна (ношир - муштарӣ). Аммо биёед кӯшиш кунем, ки онро бо истифода аз мисоли калисои католикӣ фаҳмем :) Он пайравон дорад, ки ба таълимоти ин калисо бовар мекунанд. Вақте ки ҳама гуна догмаҳои нав (акидаҳои ҳатмӣ) ва ғайра пайдо мешаванд, ин одамон бояд дар бораи онҳо огоҳ бошанд. Аммо чӣ гуна метавон онро бо забони барномасозӣ бо истифода аз ин намуна тасвир кард? 1. Мо "садои калисо" (худи калисо ё Папа ҳангоми пахши ex cathedra), яъне як пахшкунанда ё мавзӯъе дорем, ки дар калисо ахбор эълон мекунад. 2. Паришионерони ин калисо ҳастанд, яъне баъзе нозироне ҳастанд, ки мехоҳанд аз рӯйдодҳои муҳим огоҳ бошанд. Мувофиқи он, имрӯз метавонад 1,3 миллиард паришионерҳо бошад ва фардо кам ё бештар бошанд. Ва шумо танҳо лозим аст, ки онҳоеро, ки дар ин калисо ҳастанд, огоҳ кунед (аз нав атеистҳоро ташвиш додан лозим нест :). Ҳамин тариқ, ҳамаи инро метавон чунин ифода кард: Калисое ҳаст, ки ба рамаи худ дар бораи чизе нақл мекунад, ки шумо метавонед дар он сабти ном кунед ё баръакс онро тарк кунед:
public interface Church {
    void registerParishioner(Parishioner parishioner);
    void removeParishioner(Parishioner parishioner);
    void notifyParishioners();
}
Калисои махсуси католикӣ бо татбиқи ин усулҳо вуҷуд дорад, инчунин ахбор ва рӯйхати одамоне, ки ин хабар бояд ба онҳо пахш карда шавад:
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);
    }
}
Паришионере ҳаст, ки метавонад ба калисо ворид ё тарк шавад (барои содда кардани code, мо танҳо ба ӯ иҷозат медиҳем, ки ворид шавад :)
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);
    }
}
Мувофиқи он, он чӣ гуна кор хоҳад кард:
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 года");
    }
}
ва натиҷаи барнома:
Мартин Лютер узнал новость: Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года
Жан Кальвин узнал новость: Инквизиция была ошибкой... месса Mea Culpa 12 марта 2000 года
Онхое. Ҳамин ки хабар дар калисо пайдо мешавад, ҳар касе, ки дар қатори аъзоёни ба қайд гирифташудаи ин калисо аст, дар ин бора огоҳ карда мешавад. Камбудиҳои ин татбиқ кадомҳоянд: 1. Аввалан, интерфейсе, ки шумо метавонед сабти ном ва гирифтани ахборро на танҳо ба ин калисо тааллуқ дорад (ин метавонад талаб карда шавад). Аз ин рӯ, онро фавран ба интерфейси алоҳидаи мушоҳидашаванда интиқол додан мумкин аст. 2. Ҳаминро метавон бо калисоҳои калисо анҷом дод, яъне усули навсозиро ба интерфейси алоҳида интиқол диҳед ва онро барои паришионери дилхоҳ амалӣ кунед. Он гоҳ ин усулро умуман на аз ҷониби паришионерони калисои католикӣ, балки, масалан, онҳое, ки дар мавҷудияти элфҳо зиндагӣ мекунанд (маънои ҳаракати "Роҳи ягона") истифода бурда метавонанд. Онхое. интерфейси Observer бо усули навсозӣ эҷод кунед. Дар охир чӣ мешавад:
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);
    }
}
Ҳамин тавр: Мо «пайванди байни калисо ва паришионеронро суст кардем», ки табиатан танҳо дар барномасозӣ хуб аст :) Мавзӯъ (калисои католикӣ) танҳо рӯйхати шунавандагон (паришионерҳо) дорад ва ҳангоми гирифтани ахбор (тағйирот), ин хабарро пахш мекунад. ба шунавандагонаш. Шумо ҳоло метавонед ягон сохтори дигар (масалан, калисои протестантӣ) эҷод кунед ва ин хабарро ба шунавандагони "шумо" пахш кунед. Шумо инчунин бояд ба назар гиред, ки маълумоти синфи 2 (аниқтараш, синфи Observable ва интерфейси Observer) дар бастаи java.util дастрас буданд, аммо ҳоло онҳо Deprecation бо java 9 мебошанд (https://docs.oracle. com/en/java/javase/15/ docs/api/java.base/java/util/Observable.html): Қатъшуда. Ин синф ва интерфейси Observer бекор карда шудаанд. Модели рӯйдодҳое, ки аз ҷониби Observer ва Observable дастгирӣ мешаванд, хеле маҳдуд аст, тартиби огоҳиномаҳои аз ҷониби Observable расонидашуда мушаххас нест ва тағиротҳои ҳолат дар мукотибаи як ба як бо огоҳиҳо нестанд. Барои модели ғании рӯйдодҳо, истифодаи бастаи java.beansро баррасӣ кунед. Барои паёмнависии боэътимод ва фармоишӣ дар байни риштаҳо, истифодаи яке аз сохторҳои ҳамзамон маълумотро дар бастаи java.util.concurrent баррасӣ кунед. Барои барномасозии услуби ҷараёнҳои реактивӣ, ба API Flow нигаред. Аз ин рӯ, истифодаи онҳо лозим нест. Ва шумо метавонед ба ҷои дигарон истифода баред, аммо моҳияти намуна тағир намеёбад. Масалан, биёед кӯшиш кунем, ки аз бастаи java.beans PropertyChangeListener-ро истифода барем (то нанавиштани синфҳои нолозим, ки аллакай навишта шудаанд) истифода барем. Биёед бубинем, ки он чӣ гуна хоҳад буд: синфи фан:
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;
    }
}
ва синфи шунавандагон:
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);
    }
}
Агар мо codeи зеринро иҷро кунем:
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 год");
}
Мо натиҷаи зеринро ба даст меорем:
Мартин Лютер узнал новость: Дева Мария имеет непорочное зачатие... булла Ineffabilis Deus... 8 декабря 1854 года Папа Пий IX Жан Кальвин узнал новость: Дева Мария имеет непорочное зачатие... булла Ineffabilis Deus... 8 декабря 1854 года Папа Пий IX Мартин Лютер узнал новость: Папа непогрешим... не всегда конечно, а только когда транслирует учение церкви ex cathedra... Первый Ватиканский собор 1869 год Жан Кальвин узнал новость: Папа непогрешим... не всегда конечно, а только когда транслирует учение церкви ex cathedra... Первый Ватиканский собор 1869 год
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION