الگوی طراحی قابل مشاهده در بسیاری از APIهای جاوا و در برنامه نویسی واکنشی یافت می شود. در اینجا مقدمه ای بر الگوی قابل مشاهده بی زمان در جاوا است.
- نمونهای از الگوی قابل مشاهده
- عناصر الگوی طراحی قابل مشاهده
- الگوی قابل مشاهده در کد
- قابل مشاهده در عمل
- زمان استفاده از الگوی قابل مشاهده
- نتیجهگیری
الگوی طراحی قابل مشاهده در بسیاری از APIهای مهم جاوا استفاده می شود. یکی از نمونه های معروف JButton است که از ActionListener
API برای اجرای یک عمل استفاده می کند. در این مثال، ما یک ActionListener
داریم که روی دکمه گوش می دهد یا مشاهده می کند. وقتی روی دکمه کلیک میشود، ActionListener
یک عمل را انجام میدهد.
الگوی قابل مشاهده نیز با برنامه نویسی واکنشی استفاده می شود. استفاده از مشاهدهگرها در کاربردهای واکنشی منطقی است زیرا ماهیت واکنش واکنشی است: زمانی اتفاق می افتد که فرآیند دیگری رخ دهد.
قابل مشاهده یک الگوی طراحی رفتاری است. عملکرد آن انجام یک عمل در هنگام وقوع یک رویداد است. دو مثال رایج عبارتند از کلیک روی دکمه و اعلانها، اما کاربردهای بسیار بیشتری برای این الگو وجود دارد.
نمونه ای از الگوی قابل مشاهده
در الگوی Observable، یک شی به شی دیگری در هنگام انجام یک عمل اطلاع می دهد. برای درک ارزش الگو، بیایید سناریویی را تصور کنیم که در آن دکمه ای باید کلیک شود و هیچ اعلانی برای یک شی دیگر وجود ندارد، همانطور که در شکل ۱ نشان داده شده است.
شکل ۱. ActionCheck دکمه را یک بار در ثانیه بررسی می کند.
توجه کنید که ActionCheck
باید دکمه را یک بار در ثانیه بررسی کند. حال تصور کنید اگر در هر ثانیه چندین بررسی عملی برای این دکمه داشته باشیم. آیا می توانید تصور کنید که چه کاری با عملکرد برنامه شما انجام می دهد؟
بسیار ساده تر است که به دکمه انجام کاری اجازه دهید 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
را بارها بررسی کنید. تصور کنید که بیش از ۲۰۰ شی نیاز به دریافت اعلان دارند. در آن صورت، شما باید ۲۰۰ را در تعداد دفعاتی که بررسی انجام می شود ضرب کنید.
با استفاده از الگوی قابل مشاهده، اعلان فقط یک بار برای همه مشترکین شما اتفاق می افتد. این یک افزایش عملکرد بزرگ و همچنین بهینه سازی کد موثر است. این کد به راحتی قابل گسترش یا تغییر است.
پارادایم برنامه نویسی واکنشی از الگوی مشاهده پذیر در همه جا استفاده می کند. اگر تا به حال با Angular کار کرده اید، می دانید که استفاده از کامپوننت های قابل مشاهده بسیار رایج است. مؤلفههای واکنشی اغلب توسط رویدادها و منطق دیگر مشاهده میشوند، و هنگامی که یک شرط خاص برآورده شد، مؤلفه برخی از اقدامات را انجام میدهد.
نتیجه گیری
در اینجا نکات مهمی وجود دارد که باید در مورد الگوی طراحی قابل مشاهده به خاطر بسپارید:
- Observable از اصل SOLID باز-بسته استفاده میکند. این بدان معناست که میتوانیم روشهای
addSubscriber
وremoveSubscriber
را بدون نیاز به تغییر امضای روش گسترش دهیم. دلیل آن این است که به جای اجرای مستقیم، رابطموضوع
را دریافت کرد. - واسط
Observer
هر عملی را که درموضوع
انجام میشود مشاهده میکند. -
موضوع
قابل مشاهده
نیز نامیده می شود زیرا موضوعی است که مشاهده می شود. ممکن است به عنوانPublisher
نیز شناخته شود زیرا رویدادها را منتشر می کند. -
ناظر
رامشترک
نیز مینامند زیرا درموضوع
/ناشر
مشترک میشود.Observer
هنگامی که اقدامی انجام می شود مطلع می شود. - اگر از الگوی طراحی قابل مشاهده استفاده نمیکردیم،
مشترک
باید دائماً نظرسنجی میکرد تا بداند آیا رویدادی رخ داده است که میتواند برای عملکرد برنامه شما وحشتناک باشد. قابل مشاهده راه حل کارآمدتری است.
پست های مرتبط
مقدمه ای بر الگوی طراحی قابل مشاهده
مقدمه ای بر الگوی طراحی قابل مشاهده
مقدمه ای بر الگوی طراحی قابل مشاهده