۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

مقدمه ای بر الگوی طراحی قابل مشاهده

الگوی طراحی قابل مشاهده در بسیاری از APIهای جاوا و در برنامه نویسی واکنشی یافت می شود. در اینجا مقدمه ای بر الگوی قابل مشاهده بی زمان در جاوا است.

الگوی طراحی قابل مشاهده در بسیاری از APIهای جاوا و در برنامه نویسی واکنشی یافت می شود. در اینجا مقدمه ای بر الگوی قابل مشاهده بی زمان در جاوا است.

الگوی طراحی قابل مشاهده در بسیاری از APIهای مهم جاوا استفاده می شود. یکی از نمونه های معروف JButton است که از ActionListener API برای اجرای یک عمل استفاده می کند. در این مثال، ما یک ActionListener داریم که روی دکمه گوش می دهد یا مشاهده می کند. وقتی روی دکمه کلیک می‌شود، ActionListener یک عمل را انجام می‌دهد.

الگوی قابل مشاهده نیز با برنامه نویسی واکنشی استفاده می شود. استفاده از مشاهدهگرها در کاربردهای واکنشی منطقی است زیرا ماهیت واکنش واکنشی است: زمانی اتفاق می افتد که فرآیند دیگری رخ دهد.

قابل مشاهده یک الگوی طراحی رفتاری است. عملکرد آن انجام یک عمل در هنگام وقوع یک رویداد است. دو مثال رایج عبارتند از کلیک روی دکمه و اعلان‌ها، اما کاربردهای بسیار بیشتری برای این الگو وجود دارد.

نمونه ای از الگوی قابل مشاهده

در الگوی Observable، یک شی به شی دیگری در هنگام انجام یک عمل اطلاع می دهد. برای درک ارزش الگو، بیایید سناریویی را تصور کنیم که در آن دکمه ای باید کلیک شود و هیچ اعلانی برای یک شی دیگر وجود ندارد، همانطور که در شکل ۱ نشان داده شده است.

نمودار الگوی طراحی قابل مشاهده.

شکل ۱. ActionCheck دکمه را یک بار در ثانیه بررسی می کند.

توجه کنید که ActionCheck باید دکمه را یک بار در ثانیه بررسی کند. حال تصور کنید اگر در هر ثانیه چندین بررسی عملی برای این دکمه داشته باشیم. آیا می توانید تصور کنید که چه کاری با عملکرد برنامه شما انجام می دهد؟

Mastodon، Steampipe و RSS

بسیار ساده تر است که به دکمه انجام کاری اجازه دهید ActionCheck را مطلع کند. به این ترتیب، منطق ActionCheck نیازی به نظرسنجی دکمه انجام کاری در هر ثانیه ندارد.

عناصر الگوی طراحی قابل مشاهده

در نمودار زیر، توجه کنید که اساس الگوی Observer، رابط Observer (یعنی شیئی که مشاهده می کند) و موضوع (شئی که در حال مشاهده است). کلاس Newsletter Subject و Subscriber Observer را پیاده سازی می کند. سپس، در نهایت، SendEmailMain الگوی طراحی Observable را اجرا می کند.

نمودار الگوی طراحی قابل مشاهده.

شکل ۲. جریان الگوی طراحی قابل مشاهده در یک مثال مشترک.

الگوی قابل مشاهده در کد

رابط موضوع که با نام‌های قابل مشاهده یا ناشر نیز شناخته می‌شود، اساس الگوی طراحی قابل مشاهده است. اساساً، ناظران را ذخیره می کند و به محض اینکه یک اقدام تماشا شده اتفاق می افتد، آنها را مطلع می کند. به رابط موضوع نگاهی بیندازید.


public interface Subject {

    void addSubscriber(Observer observer);
    void removeSubscriber(Observer observer);
    void notifySubscribers();

}

رابط Observer

واسط Observer (همچنین گاهی اوقات به عنوان مشترک نیز شناخته می‌شود) توسط مشترک پیاده‌سازی می‌شود، که به دنبال مشاهده اینکه آیا یک عمل انجام شده است:


public interface Observer {

    public void update(String email);

}

در عمل قابل مشاهده

اجازه دهید از نمونه ای از خبرنامه برای پیاده سازی رابط موضوع استفاده کنیم. در کد زیر، ما ناظران خود – در این مورد، مشترکان خبرنامه – را ذخیره می‌کنیم و به هر مشترک از اضافه شدن ایمیل به اشتراک‌ها اطلاع داده می‌شود.


import java.util.ArrayList;
import java.util.List;

public class Newsletter implements Subject {

    protected List<Observer> observers = new ArrayList<>();
    protected String name;
    protected String newEmail;

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

    public void addNewEmail(String newEmail) {
        this.newEmail = newEmail;
        notifySubscribers();
    }

    @Override
    public void addSubscriber(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeSubscriber(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifySubscribers() {
        observers.forEach(observer -> observer.update(newEmail));
    }
}

مشترک

کلاس مشترک نشان دهنده کاربری است که در خبرنامه ایمیل مشترک شده است. این کلاس رابط Observer را پیاده سازی می کند. این شیئی است که ما مشاهده خواهیم کرد تا بدانیم آیا رویدادی رخ داده است یا خیر.


class Subscriber implements Observer {

  private String name;

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

  @Override
  public void update(String newEmail) {
    System.out.println("Email for: " + name + " | Content:" + newEmail);
  }

}

SendEmailMain

اکنون ما کلاس اصلی را داریم که باعث می شود الگوی مشاهده پذیر به طور موثر کار کند. ابتدا شی Newsletter را ایجاد می کنیم. سپس، مشترکین را اضافه و حذف خواهیم کرد. در نهایت، ما یک ایمیل اضافه می کنیم و وضعیت خود را به مشترک اطلاع می دهیم.


public class SendEmailMain {

  public static void main(String[] args) {
    Newsletter newsLetter = new Newsletter("Java Challengers");

    Observer duke = new Subscriber("Duke");
    Observer juggy = new Subscriber("Juggy");
    Observer dock = new Subscriber("Moby Dock");

    newsLetter.addSubscriber(duke);
    newsLetter.addNewEmail("Lambda Java Challenge");
    newsLetter.removeSubscriber(duke);

    newsLetter.addSubscriber(juggy);
    newsLetter.addSubscriber(dock);
    newsLetter.addNewEmail("Virtual Threads Java Challenge");
  }

}

خروجی کد ما در اینجا آمده است:


Email for: Duke | Content:Lambda Java Challenge
Email for: Juggy | Content:Virtual Threads Java Challenge
Email for: Moby Dock | Content:Virtual Threads Java Challenge

زمان استفاده از الگوی قابل مشاهده

هنگامی که عملی اتفاق می‌افتد و چندین شیء نیاز به اطلاع رسانی دارند، بهتر است از الگوی مشاهده‌پذیر استفاده کنید تا اینکه وضعیت یک Object را بارها بررسی کنید. تصور کنید که بیش از ۲۰۰ شی نیاز به دریافت اعلان دارند. در آن صورت، شما باید ۲۰۰ را در تعداد دفعاتی که بررسی انجام می شود ضرب کنید.

GraalVM Oracle از جاوا 22 پشتیبانی می کند

با استفاده از الگوی قابل مشاهده، اعلان فقط یک بار برای همه مشترکین شما اتفاق می افتد. این یک افزایش عملکرد بزرگ و همچنین بهینه سازی کد موثر است. این کد به راحتی قابل گسترش یا تغییر است.

پارادایم برنامه نویسی واکنشی از الگوی مشاهده پذیر در همه جا استفاده می کند. اگر تا به حال با Angular کار کرده اید، می دانید که استفاده از کامپوننت های قابل مشاهده بسیار رایج است. مؤلفه‌های واکنشی اغلب توسط رویدادها و منطق دیگر مشاهده می‌شوند، و هنگامی که یک شرط خاص برآورده شد، مؤلفه برخی از اقدامات را انجام می‌دهد.

اسپاتیفای، استارت آپ ها برای حمایت از نگهبانان منبع باز بودجه راه اندازی می کنند

نتیجه گیری

در اینجا نکات مهمی وجود دارد که باید در مورد الگوی طراحی قابل مشاهده به خاطر بسپارید:

  • Observable از اصل SOLID باز-بسته استفاده می‌کند. این بدان معناست که می‌توانیم روش‌های addSubscriber و removeSubscriber را بدون نیاز به تغییر امضای روش گسترش دهیم. دلیل آن این است که به جای اجرای مستقیم، رابط موضوع را دریافت کرد.
  • واسط Observer هر عملی را که در موضوع انجام می‌شود مشاهده می‌کند.
  • موضوع قابل مشاهده نیز نامیده می شود زیرا موضوعی است که مشاهده می شود. ممکن است به عنوان Publisher نیز شناخته شود زیرا رویدادها را منتشر می کند.
  • ناظر را مشترک نیز می‌نامند زیرا در موضوع/ناشر مشترک می‌شود. Observer هنگامی که اقدامی انجام می شود مطلع می شود.
  • اگر از الگوی طراحی قابل مشاهده استفاده نمی‌کردیم، مشترک باید دائماً نظرسنجی می‌کرد تا بداند آیا رویدادی رخ داده است که می‌تواند برای عملکرد برنامه شما وحشتناک باشد. قابل مشاهده راه حل کارآمدتری است.