در این جلسه تیم کدگیت را با آموزش Observer پترن در جاوا همراهی کنید. در ابتدا مروری بر Behavioral Design Pattern داریم. سپس Observer را معرفی کرده و در آخر با زدن یک مثال واقعی از این پترن، آموزش را پایان میبریم. پیشنهاد میکنیم قبل از مطالعه این جلسه، آموزشهای زیر را بررسی کنید:
- شی گرایی در جاوا
- متد در جاوا
- Constructor در جاوا
- This در جاوا
- Abstract در جاوا
- ArrayList در جاوا
- ارث بری در جاوا
Behavioral Design Pattern
یکی از زیر شاخههای دیزاین پترن Behavioral Design Pattern میباشد. یکی از وظایف اصلی این دیزاین پترن، تعامل اشیا و جداسازی وظایف آنها با یکدیگر است. تعریف کامل Behavioral Design Pattern بدین صورت است که، تمامی اشیا با یکدیگر به راحتی بتوانند ارتباط برقرار کرده، بدون آنکه باعث وابستگی بین آنها شود.
Observer پترن در جاوا
Observer پترن وقتی تعریف میشود که یک ارتباط یک به چند بین اشیا برقرار باشد بطوریکه با تغییر یکی، دیگر اشیا نیز باخبر شده و به طور اتوماتیک آپدیت شوند. اشیائی که منتظر اعلام تغییر وضعیت هستند را Observer میگویند و یک شی که به بقیه اشیا تغییر را اعلام میکند، Subject میگویند.
در دنیای برنامهنویسی مثالهای زیادی از Observer وجود دارد همانند نوشتن یک Listener برای Button. اگر دکمه زده شود متدهای که به این Button وابسته هستند باخبر شده و عملیاتی را انجام میدهند.
مثال Observer پترن در جاوا
همانطور که در توضیحات گفتیم دو نقش Observer و Subject در Observer پترن دیده میشود. در این مثال ما یک کلاس به نام Observer و Subject داریم و یک کلاینت یا همان Main برنامه ما. در کلاس Subject ما یک عدد را میگیریم و میخواهیم با استفاده از کلاس Observer آن عدد به صورت دودویی و هشت هشتی و هگزادسیمال ذخیره کنیم. هرگاه که کلاس Subject عددی را گرفت کلاس Observer را باخبر میکند و انواع نمایشهای آن عدد را نشان خواهیم داد. کد این مثال به صورت زیر است:
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
public void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
public class BinaryObserver extends Observer {
public BinaryObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Binary String: "
+ Integer.toBinaryString(subject.getState()));
}
}
public class OctalObserver extends Observer{
public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) );
}
}
public class HexaObserver extends Observer {
public HexaObserver(Subject subject) {
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println("Hex String: "
+ Integer.toHexString(subject.getState()).toUpperCase());
}
}
تست برنامه Observer پترن در جاوا
برای تست کدهای بالا،کد Main زیر را اجرا کنید:
public static void main(String[] args) {
Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
خروجی برنامه به صورت زیر میباشد:
First state change: 20
Hex String: 14
Octal String: 24
Binary String: 10100
Second state change: 40
Hex String: 28
Octal String: 50
Binary String: 101000