JavaRush /جاوا بلاگ /Random-UR /مبصر ٹیمپلیٹ

مبصر ٹیمپلیٹ

گروپ میں شائع ہوا۔
جیسا کہ گینگ آف فور لکھتا ہے (4 اعلیٰ درجے کے ڈویلپرز کی کتاب "آبجیکٹ اورینٹڈ ڈیزائن پیٹرنز" کا حوالہ دیتے ہوئے)، اس پیٹرن کا مقصد اشیاء کے درمیان ایک سے کئی انحصار کو اس طرح بیان کرنا ہے کہ جب ایک چیز کی حالت بدل جاتی ہے، اس پر انحصار کرنے والوں کو اس کے بارے میں مطلع کیا جاتا ہے اور خود بخود اپ ڈیٹ ہو جاتا ہے۔ اس پیٹرن کو بھی کہا جاتا ہے: منحصر (ماتحت) یا Publish-Subscribe (ناشر - سبسکرائبر)۔ لیکن آئیے کیتھولک چرچ کی مثال سے اس کا پتہ لگانے کی کوشش کریں :) اس کے پیروکار ہیں جو اس چرچ کی تعلیمات پر یقین رکھتے ہیں۔ جب کوئی نیا عقیدہ (واجب عقیدہ) اور اس سے زیادہ ظاہر ہوتا ہے تو ان لوگوں کو ان کے بارے میں جان لینا چاہیے۔ لیکن اس پیٹرن کا استعمال کرتے ہوئے اسے پروگرامنگ زبان میں کیسے بیان کیا جا سکتا ہے؟ 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. سب سے پہلے، وہ انٹرفیس جہاں آپ رجسٹر اور خبریں حاصل کر سکتے ہیں نہ صرف اس چرچ سے متعلق ہو سکتا ہے (اس کی ضرورت ہو سکتی ہے)۔ لہذا، اسے فوری طور پر ایک علیحدہ قابل مشاہدہ انٹرفیس میں منتقل کرنا ممکن ہوگا۔ 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 java پیکیج میں دستیاب تھا، لیکن اب وہ java 9 (https://docs.oracle. com/en/java/javase/15/ docs/api/java.base/java/util/Observable.html): فرسودہ۔ اس کلاس اور آبزرور انٹرفیس کو فرسودہ کر دیا گیا ہے۔ آبزرور اور آبزرویبل کے ذریعہ تعاون یافتہ ایونٹ ماڈل کافی محدود ہے، آبزرویبل کے ذریعہ فراہم کردہ اطلاعات کی ترتیب غیر متعین ہے، اور ریاستی تبدیلیاں اطلاعات کے ساتھ یکے بعد دیگرے خط و کتابت میں نہیں ہیں۔ ایک بھرپور ایونٹ ماڈل کے لیے، java.beans پیکج استعمال کرنے پر غور کریں۔ دھاگوں کے درمیان قابل اعتماد اور ترتیب شدہ پیغام رسانی کے لیے، java.util.concurrent پیکیج میں ایک ساتھ ڈیٹا ڈھانچہ استعمال کرنے پر غور کریں۔ ری ایکٹو اسٹریمز اسٹائل پروگرامنگ کے لیے، فلو API دیکھیں۔ اس لیے انہیں استعمال کرنے کی ضرورت نہیں ہے۔ اور آپ اس کے بجائے دوسروں کو استعمال کرسکتے ہیں، لیکن پیٹرن کا جوہر تبدیل نہیں ہوگا۔ مثال کے طور پر، آئیے java.beans پیکیج سے PropertyChangeListener استعمال کرنے کی کوشش کریں (تاکہ غیر ضروری کلاسز نہ لکھیں جو پہلے ہی لکھی جاچکی ہیں)۔ آئیے دیکھتے ہیں کہ یہ کیسا ہوگا: subject class:
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