design pattern, java, جاوا, دیزاین پترن

Observer پترن در جاوا (Observer Pattern)

Observer پترن در جاوا

در این جلسه تیم کدگیت را با آموزش Observer پترن در جاوا همراهی کنید. در ابتدا مروری بر Behavioral Design Pattern داریم. سپس Observer را معرفی کرده و در آخر با زدن یک مثال واقعی از این پترن، آموزش را پایان می‌بریم. پیشنهاد می‌کنیم قبل از مطالعه این جلسه، آموزش‌های زیر را بررسی کنید:

  1. شی گرایی در جاوا
  2. متد در جاوا
  3. Constructor در جاوا
  4. This در جاوا
  5. Abstract در جاوا
  6. ArrayList در جاوا
  7. ارث بری در جاوا

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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *