JavaRush /جاوا بلاگ /Random-SD /مبصر ٽيمپليٽ

مبصر ٽيمپليٽ

گروپ ۾ شايع ٿيل
جيئن ته گينگ آف فور لکي ٿو (4 اعليٰ درجي جي ڊولپرز جي ڪتاب ”آبجڪٽ-اورينٽيڊ ڊيزائن پيٽرن“ جو حوالو ڏيندي)، هن نموني جو مقصد اهو آهي ته شين جي وچ ۾ هڪ کان گهڻن انحصار کي اهڙي طرح بيان ڪيو وڃي ته جڏهن ھڪڙي شئي جي حالت تبديل ٿي وڃي ٿي، اھي سڀ جيڪي ان تي منحصر آھن ان بابت مطلع ڪيا ويا آھن ۽ خودڪار طور تي اپڊيٽ ٿيل آھن. هن نموني کي پڻ سڏيو ويندو آهي: انحصار ڪندڙ (ماتحت) يا شايع ڪندڙ-سبسڪرائبر (پبلشر - سبسڪرائبر). پر اچو ته ڪيٿولڪ چرچ جي مثال کي استعمال ڪندي ان کي سمجهڻ جي ڪوشش ڪريو :) ان جا پيروڪار آهن جيڪي هن چرچ جي تعليمات تي يقين رکن ٿا. جڏهن ڪو به نئون عقيدو (فرضي عقيدو) ۽ وڌيڪ ظاهر ٿئي ته انهن ماڻهن کي انهن بابت ڄاڻڻ گهرجي. پر هن نموني کي استعمال ڪندي پروگرامنگ ٻولي ۾ ڪيئن بيان ڪري سگهجي ٿو؟ 1. اسان وٽ "چرچ جو آواز" (چرچ پاڻ يا پوپ جڏهن اڳوڻي ڪيٿيڊرا کي نشر ڪري ٿو)، اهو آهي، هڪ خاص براڊڪاسٽر يا مضمون جيڪو چرچ ۾ خبرن جو اعلان ڪري ٿو. 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);
    }
}
اتي ھڪڙو پادري آھي جيڪو چرچ ۾ داخل يا ڇڏي سگھي ٿو (ڪوڊ کي آسان ڪرڻ لاء، اسان صرف ان کي داخل ٿيڻ جي اجازت ڏينداسين :)
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. پهريون، انٽرفيس جتي توهان رجسٽر ڪري سگهو ٿا ۽ خبرون حاصل ڪري سگهو ٿا نه رڳو هن چرچ (اهو گهربل هجي). تنهن ڪري، ان کي فوري طور تي هڪ الڳ Observable انٽرفيس ۾ منتقل ڪرڻ ممڪن ٿيندو. 2. اهو ئي ڪري سگهجي ٿو چرچ جي پاڙيسرين سان، يعني، اپڊيٽ جي طريقي کي هڪ الڳ انٽرفيس ۾ منتقل ڪريو ۽ ان کي گهربل پارشينر لاءِ لاڳو ڪريو. پوء اهو طريقو عام طور تي استعمال ڪري سگهجي ٿو نه ڪيٿولڪ چرچ جي پارسيئنرز طرفان، پر، مثال طور، انهن جي طرفان جيڪي ايلز جي وجود ۾ رهن ٿا (مطلب "يونيڪورن ڏانهن روڊ" تحريڪ). اهي. تازه ڪاري طريقي سان هڪ مبصر انٽرفيس ٺاهيو. آخر ڇا ٿيندو:
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 ڊيٽا (وڌيڪ واضح طور تي، مشاهدو ڪندڙ ڪلاس ۽ مبصر انٽرفيس) java.util جاوا پيڪيج ۾ موجود هئا، پر هاڻي اهي جاوا 9 (https://docs.oracle) سان Deprecation آهن. com/en/java/javase/15/ docs/api/java.base/java/util/Observable.html): ختم ٿيل. ھي ڪلاس ۽ مبصر انٽرفيس کي ختم ڪيو ويو آھي. ايونٽ ماڊل جيڪو مبصر ۽ آبزرويبل جي مدد سان ڪافي محدود آهي، آبزرويبل پاران موڪليل اطلاعن جي ترتيب اڻ ڄاڻايل آهي، ۽ رياستي تبديليون نوٽيفڪيشن سان هڪ ٻئي سان واسطو رکندڙ نه آهن. هڪ امير واقعي واري ماڊل لاءِ، استعمال ڪرڻ تي غور ڪريو java.beans پيڪيج. ٿريڊز جي وچ ۾ قابل اعتماد ۽ ترتيب ڏنل پيغام پهچائڻ لاءِ، java.util.concurrent پيڪيج ۾ سمورو ڊيٽا ڍانچي مان هڪ کي استعمال ڪرڻ تي غور ڪريو. رد عمل واري اسٽريم جي طرز جي پروگرامنگ لاءِ، ڏسو فلو API. تنهن ڪري، ان کي استعمال ڪرڻ جي ڪا ضرورت ناهي. ۽ توھان ان جي بدران ٻين کي استعمال ڪري سگھو ٿا، پر نموني جو بنياد تبديل نه ٿيندو. مثال طور، اچو ته استعمال ڪرڻ جي ڪوشش ڪريون PropertyChangeListener (جيئن غير ضروري ڪلاس نه لکن جيڪي اڳي ئي لکيا ويا آهن) java.beans پيڪيج مان. اچو ته ڏسو ته اهو ڪيئن ٿيندو: مضمون ڪلاس:
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);
    }
}
جيڪڏهن اسان هيٺ ڏنل ڪوڊ تي عمل ڪريون ٿا:
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 год");
}
اسان هيٺ ڏنل نتيجو حاصل ڪندا آهيون:
مارٽن لوٿر کي خبر معلوم ٿي: دي ورجن ميري بي عيب تصور جي آهي... بيل انفيبيليس ڊيوس... 8 ڊسمبر 1854ع تي پوپ پائيس IX جان ڪيلوين اها خبر سکي: دي ورجن ميري بي عيب تصور جي آهي... بيل انفيبيلس ڊيوس ... ڊسمبر 8، 1854 پوپ پيس IX مارٽن لوٿر کي خبر پئجي وئي: پوپ ناقابل فراموش آهي ... هميشه بلڪل نه، پر صرف جڏهن هو چرچ جي تعليمات کي نشر ڪري ٿو، اڳوڻي ڪيٿيڊرا ... پهرين ويٽيڪن ڪائونسل 1869 جان ڪيلوين سکيا. خبر: پوپ ناقابل فراموش آهي ... هميشه هميشه نه، پر صرف جڏهن هو چرچ جي تعليم کي نشر ڪري ٿو ايڪس ڪيٿيڊرا ... پهرين ويٽيڪن ڪائونسل 1869
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION