بخش های اصلی

آموزش الگوهای طراحی

Design Pattern - الگوی Observer

الگوی Observer، زمانی که میان اشیاء رابطه ی یک به چند وجود داشته باشه به کار میره، مثلا اگه شیءای تغییر کنه، اشیاءِ وابسته به آن هم سریعاً مطلع میشن، الگوی Observer زیرگروهِ الگوی رفتاری (behavioral) محسوب میشه.

پیاده سازی

الگوی Observer از کلاس های actor استفاده می کنه. Subject، Observer و Client. Subject شیءایِه که حاوی متدهاییِه برای اتصال و قطع اتصالِ Observerها به شیءِ Client. یک کلاسِ انتزاعی (abstract) به نام Observer و یک کلاسِ concrete به نام Subject که کلاسِ Observer را توسعه میده، ایجاد می کنیم.

ObserverPatternDemo، در نسخه ی آزمایشیِ کلاس مان، از Subject و کلاسِ concreteای به نام object برای نشان دادن الگوی Observer در عمل، استفاده خواهیم کرد.

observer pattern uml diagram

مرحله ی 1

ایجاد کلاسِ Subject.

Subject.java

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

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();
      }
   } 	
}

مرحله ی 2

ایجاد کلاسِ.Observer

Observer.java

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

مرحله ی 3

ایجاد کلاس های concrete Observer.

BinaryObserver.java

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() ) ); 
   }
}

OctalObserver.java

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() ) ); 
   }
}

HexaObserver.java

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() ); 
   }
}

مرحله ی 4

استفاده از اشیاء Subject و concrete observer.

ObserverPatternDemo.java

public class ObserverPatternDemo {
   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);
   }
}

مرحله ی 5

بررسی خروجی

First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010
در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش الگوهای طراحی

Learn Design Patterns

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد