আমাদের কখন পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য ব্যবহার করা উচিত?


200

একজন সাক্ষাত্কার আমাকে জিজ্ঞাসা করলেন:

কি ObserverএবংObservable যখন আমরা তাদের ব্যবহার করা উচিত?

আমি এই শর্তাদি সম্পর্কে অবগত ছিলাম না, তাই আমি যখন বাড়ি ফিরে এসে গুগলিং শুরু করেছি Observerএবং Observable, আমি বিভিন্ন উত্স থেকে কিছু পয়েন্ট পেয়েছি:

1) Observableএকটি শ্রেণি এবং Observerএকটি ইন্টারফেস।

2) Observableক্লাস Observerএস এর একটি তালিকা বজায় রাখে ।

৩) যখন কোনও Observableঅবজেক্ট আপডেট করা হয়, এটি update()তার প্রতিটিটির পদ্ধতির অনুরোধ করে Observerতা জানানোর জন্য, এটি পরিবর্তন করা হয়।

আমি এই উদাহরণটি পেয়েছি:

import java.util.Observable;
import java.util.Observer;

class MessageBoard extends Observable
{
    public void changeMessage(String message) 
    {
        setChanged();
        notifyObservers(message);
    }
}

class Student implements Observer 
{
    @Override
    public void update(Observable o, Object arg) 
    {
        System.out.println("Message board changed: " + arg);
    }
}

public class MessageBoardTest 
{
    public static void main(String[] args) 
    {
        MessageBoard board = new MessageBoard();
        Student bob = new Student();
        Student joe = new Student();
        board.addObserver(bob);
        board.addObserver(joe);
        board.changeMessage("More Homework!");
    }
}

তবে কেন আমাদের দরকার Observerএবং আমি বুঝতে পারি না Observable? এর জন্য setChanged()এবং notifyObservers(message)পদ্ধতিগুলি কী কী ?


লিঙ্কটি কাজ করছে না। @ এন্ড্রয়েডার আপনি কি আপডেট লিংক সরবরাহ করতে পারেন?
প্রীতেক

আপনি যদি জাভা 6 বা ততোধিক
রমিজ উদ্দিন

1
ডিজাইনের ধরণগুলির একটি ভাল বোঝার জন্য আমি এই বইটি পড়ার জন্য সুপারিশ করব । এটি নির্বোধ হিসাবে আসে, তবে এটি একটি দুর্দান্ত শেখার সরঞ্জাম।
countofmontecristo

1
সবাই দয়া করে নোট করুন; : অবজারভার / পর্যবেক্ষণযোগ্য জাভা 9. বিকল্প মধ্যে অবচিত stackoverflow.com/questions/46380073/...
eren130

উত্তর:


265

আপনার কাছে স্টুডেন্ট এবং মেসেজবোর্ডের একটি দৃ concrete় উদাহরণ রয়েছে। শিক্ষার্থী পর্যবেক্ষকদের তালিকায় নিজেকে যুক্ত করে নিবন্ধভুক্ত করে যে মেসেজবোর্ডে কোনও নতুন বার্তা পোস্ট করা হলে বিজ্ঞপ্তি জানাতে চায়। মেসেজবোর্ডে কোনও বার্তা যুক্ত করা হলে এটি পর্যবেক্ষকদের তালিকার উপরে পুনরাবৃত্তি করে এবং ঘটনাটি ঘটেছে তা তাদের জানিয়ে দেয়।

টুইটার ভাবুন। যখন আপনি বলছেন যে আপনি কাউকে অনুসরণ করতে চান, টুইটার আপনাকে তাদের অনুসরণকারী তালিকায় যুক্ত করে। যখন তারা একটি নতুন টুইট পাঠিয়েছে, আপনি এটি আপনার ইনপুটটিতে দেখতে পাবেন। সেক্ষেত্রে আপনার টুইটার অ্যাকাউন্টটি পর্যবেক্ষক এবং আপনি যে ব্যক্তি অনুসরণ করছেন তিনি পর্যবেক্ষণযোগ্য।

উপমাটি নিখুঁত হতে পারে না, কারণ টুইটারের মধ্যস্থতাকারী হওয়ার সম্ভাবনা বেশি। তবে এটি পয়েন্টটি চিত্রিত করে।


57

খুব সাধারণ ভাষায় (কারণ অন্যান্য উত্তরগুলি আপনাকে যাইহোক সমস্ত সরকারী নকশার নিদর্শনগুলিতে উল্লেখ করছে, সুতরাং আরও বিশদগুলির জন্য সেগুলি দেখুন):

আপনি যদি আপনার প্রোগ্রামের ইকোসিস্টেমের অন্যান্য ক্লাস দ্বারা পর্যবেক্ষণ করা এমন একটি ক্লাস রাখতে চান তবে আপনি যে ক্লাসটি পর্যবেক্ষণযোগ্য হতে চান তা বলতে পারেন। অর্থাৎ এর রাজ্যে কিছু পরিবর্তন হতে পারে যা আপনি প্রোগ্রামের বাকী অংশে সম্প্রচার করতে চান।

এখন এটি করার জন্য আমাদের একধরণের পদ্ধতি কল করতে হবে। আমরা চাই না যে পর্যবেক্ষণযোগ্য শ্রেণি পর্যবেক্ষণে আগ্রহী এমন শ্রেণীর সাথে দৃ tight়ভাবে মিলিত হোক। এটি নির্দিষ্ট মানদণ্ডটি যতক্ষণ পূরণ করে ততক্ষণ কে এটি তার যত্ন নেয় না। (কল্পনা করুন এটি একটি রেডিও স্টেশন, যতক্ষণ না তাদের ফ্রিকোয়েন্সিতে কোনও এফএম রেডিও সুরক্ষিত থাকে ততক্ষণ কে সে শুনছে সেদিকে খেয়াল নেই)। এটি অর্জনের জন্য আমরা একটি ইন্টারফেস ব্যবহার করি, যা পর্যবেক্ষক হিসাবে উল্লেখ করা হয়।

সুতরাং, পর্যবেক্ষণযোগ্য শ্রেণিতে পর্যবেক্ষকদের একটি তালিকা থাকবে (উদাহরণস্বরূপ আপনার থাকতে পারে পর্যবেক্ষক ইন্টারফেসের পদ্ধতিগুলি বাস্তবায়নের উদাহরণ)। যখনই এটি কোনও কিছু সম্প্রচার করতে চায়, এটি কেবল একের পর এক সমস্ত পর্যবেক্ষকদের কাছে পদ্ধতিটি কল করে।

ধাঁধাটি বন্ধ করার শেষ জিনিসটি পর্যবেক্ষণযোগ্য শ্রেণি কীভাবে জানতে পারবে কে আগ্রহী? সুতরাং পর্যবেক্ষক শ্রেণিকে অবশ্যই পর্যবেক্ষকদের তাদের আগ্রহের নিবন্ধ করার সুযোগ দেওয়ার জন্য কিছু ব্যবস্থা দিতে হবে। addObserver(Observer o)অভ্যন্তরীণভাবে একটি পদ্ধতি পর্যবেক্ষকদের তালিকায় পর্যবেক্ষক যুক্ত করে, যাতে যখন গুরুত্বপূর্ণ কিছু ঘটে তখন তা তালিকার বাইরে চলে যায় এবং তালিকার প্রতিটি উদাহরণের পর্যবেক্ষকের ইন্টারফেসের সম্পর্কিত নোটিফিকেশন পদ্ধতিটিকে কল করে।

এটি হতে পারে যে সাক্ষাত্কারে তারা আপনাকে জেনেরিক ধারণা সম্পর্কে java.util.Observerএবং স্পষ্টভাবে জিজ্ঞাসা করেনি java.util.Observable। ধারণাটি একটি ডিজাইনের ধরণ, যা আপনার যখন প্রয়োজন হয় তখন তা দ্রুত বাস্তবায়নে সহায়তা করার জন্য জাভা সরাসরি বাক্সের বাইরে সহায়তা সরবরাহ করে। সুতরাং আমি প্রস্তাব দিচ্ছি যে আপনি আসল পদ্ধতি / ক্লাসগুলির চেয়ে ধারণাটি বোঝেন (যা আপনার যখন প্রয়োজন হয় তখন আপনি তা দেখতে পারেন)।

হালনাগাদ

আপনার মন্তব্যের জবাবে, আসল java.util.Observable শ্রেণীটি নিম্নলিখিত সুবিধাগুলি সরবরাহ করে:

  1. java.util.Observerউদাহরণগুলির একটি তালিকা বজায় রাখা । বিজ্ঞাপিত হতে আগ্রহী নতুন উদাহরণগুলির মাধ্যমে যুক্ত করা যেতে পারেaddObserver(Observer o) এবং এর মাধ্যমে মুছে ফেলা যায় deleteObserver(Observer o)

  2. একটি অভ্যন্তরীণ অবস্থা বজায় রাখা, পর্যবেক্ষণকারীদের শেষ বিজ্ঞপ্তি থেকে অবজেক্টটি পরিবর্তিত হয়েছে কিনা তা নির্দিষ্ট করে। এটি দরকারী কারণ এটি যে অংশটি আপনি বলছেন যে Observableঅংশটি পরিবর্তিত হয়েছে, সেই অংশটি থেকে পৃথক করে যেখানে আপনি পরিবর্তনগুলি জানান। (উদাহরণস্বরূপ এটি কার্যকর যদি আপনার একাধিক পরিবর্তন ঘটে থাকে এবং প্রতিটি ছোট পদক্ষেপের পরিবর্তে আপনি কেবল প্রক্রিয়া শেষে অবহিত করতে চান)। এটি মাধ্যমে সম্পন্ন করা হয় setChanged()। আপনি যখন কিছুতে পরিবর্তন করেছিলেন তখন আপনি কেবল এটি কল করেনObservable এবং আপনি Observersবাকীটি অবশেষে এটি জানতে চান।

  3. সমস্ত পর্যবেক্ষককে অবহিত করা হচ্ছে যে সুনির্দিষ্ট Observableরাষ্ট্রের পরিবর্তন হয়েছে। এটি মাধ্যমে সম্পন্ন করা হয় notifyObservers()setChanged()বিজ্ঞপ্তিটি এগিয়ে যাওয়ার আগে এই বস্তুটি আসলে পরিবর্তিত হয়েছে (অর্থাত্ একটি কল করা হয়েছিল) তা পরীক্ষা করে। Objectআপনি বিজ্ঞপ্তিটি সহ কিছু অতিরিক্ত তথ্য পাস করতে চান এমন ক্ষেত্রে দুটি সংস্করণ রয়েছে, যার মধ্যে কোনও আর্গুমেন্ট নেই এবং একটি যুক্তিযুক্ত one অভ্যন্তরীণভাবে যা ঘটে তা হ'ল এটি কেবল Observerউদাহরণগুলির তালিকার মাধ্যমে পুনরাবৃত্তি update(Observable o, Object arg)করে এবং তাদের প্রত্যেকের জন্য পদ্ধতিটি কল করে। এটি Observerপর্যবেক্ষণযোগ্য অবজেক্টটি যা পরিবর্তিত হয়েছে তা বোঝায় (আপনি একাধিক পর্যবেক্ষণ করতে পারেন) এবং Object argসম্ভাব্য কিছু অতিরিক্ত তথ্য বহন করার জন্য (এর মধ্য দিয়ে গেছে) notifyObservers()


37

সংজ্ঞা

অবজেক্টর প্যাটার্ন ব্যবহার করা হয় যখন বস্তুর মধ্যে অনেকের মধ্যে একটির সম্পর্ক থাকে যেমন যদি কোনও বস্তুটি সংশোধন করা হয় তবে এর নির্ভরশীল অবজেক্টগুলি স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তি করতে হবে এবং সমস্ত নির্ভরশীল বস্তুর সাথে সম্পর্কিত পরিবর্তনগুলি করা হবে।

উদাহরণ

  1. ধরা যাক, আপনার স্থায়ী ঠিকানা পরিবর্তন করা হয়েছে তবে আপনাকে পাসপোর্ট কর্তৃপক্ষ এবং প্যান কার্ড কর্তৃপক্ষকে অবহিত করতে হবে। সুতরাং এখানে পাসপোর্ট কর্তৃপক্ষ এবং প্যান কার্ড কর্তৃপক্ষ পর্যবেক্ষক এবং আপনি একটি বিষয়।

  2. ফেসবুকেও, আপনি যদি কারও সাবস্ক্রাইব করেন তবে যখনই নতুন আপডেট আসে তখন আপনাকে অবহিত করা হবে।

কখন এটি ব্যবহার করবেন:

  1. যখন কোনও বস্তু তার স্থিতি পরিবর্তন করে, তারপরে অন্যান্য সমস্ত নির্ভরশীল অবজেক্টগুলিকে অবশ্যই ধারাবাহিকতা বজায় রাখতে তাদের রাষ্ট্র পরিবর্তন করতে হবে

  2. বিষয়টি পর্যবেক্ষকের সংখ্যা সম্পর্কে জানতে পারে না।

  3. যখন কোনও বস্তু হ'ল অবজেক্টগুলি না জেনে অন্য বিষয়গুলিকে অবহিত করতে সক্ষম হবে।

ধাপ 1

সাবজেক্ট ক্লাস তৈরি করুন।

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

}

ধাপ ২

পর্যবেক্ষক শ্রেণি তৈরি করুন।

Observer.java

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

ধাপ 3

কংক্রিট পর্যবেক্ষক ক্লাস তৈরি করুন

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

সাবজেক্ট এবং কংক্রিট পর্যবেক্ষক বস্তু ব্যবহার করুন।

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

আউটপুট যাচাই করুন।

প্রথম রাষ্ট্র পরিবর্তন: 15

হেক্স স্ট্রিং: এফ

অক্টাল স্ট্রিং: 17

বাইনারি স্ট্রিং: 1111

দ্বিতীয় রাষ্ট্র পরিবর্তন: 10

হেক্স স্ট্রিং: এ

অক্টাল স্ট্রিং: 12

বাইনারি স্ট্রিং: 1010


সুন্দরভাবে ব্যাখ্যা করেছেন :)
রুট ট্রাভেলার

3
আমি মনে করি "সংজ্ঞা" একটি টাইপো। আমি আশা করি এটি একটি টাইপো
জন

10

এগুলি পর্যবেক্ষক নকশা প্যাটার্নের অংশ । সাধারণত এক বা একাধিক ওবারভার একটি পর্যবেক্ষণযোগ্য পরিবর্তন সম্পর্কে অবহিত হন । এটি একটি বিজ্ঞপ্তি যা "কিছু" ঘটেছে, যেখানে আপনি প্রোগ্রামার হিসাবে "কিছু" অর্থ কী তা সংজ্ঞায়িত করতে পারেন।

এই নিদর্শনটি ব্যবহার করার সময়, আপনি একে অপরের থেকে উভয় সত্তাকে দ্বিগুণ করেন - পর্যবেক্ষকগুলি প্লাগযোগ্য able


আমি তারিফ করব যদি আপনি ব্যাখ্যা যোগ হবে board.changeMessage("More Homework!");আপনার উত্তর, আমি বলতে চাচ্ছি কি ঘটতে যখন changeMessage("More Homework!");চালনা করা হয়েছে।
রবি

9

পর্যবেক্ষক ওরফে কলব্যাক পর্যবেক্ষণে নিবন্ধভুক্ত।

এটি উদাহরণস্বরূপ জানার জন্য ব্যবহৃত হয় যে কোনও সময়ে ঘটেছিল এমন ঘটনা সম্পর্কে। এটি সুইং, অ্যাজাক্স, জিডাব্লুটিটিতে যেমন ইউআই ইভেন্টগুলিতে (বোতামের ক্লিকগুলি, পাঠ্যক্ষেত্র পরিবর্তিত ইত্যাদি) প্রেরণে প্রেরণের জন্য ব্যবহৃত হয়।

স্যুইং-এ আপনি অ্যাডএক্সএক্সএক্সএলস্লিস্টার (শ্রোতা এল), জিডাব্লুটিটিতে আপনার (এসিএনসি) কলব্যাকের মতো পদ্ধতি খুঁজে পান।

পর্যবেক্ষকদের তালিকাটি গতিশীল হওয়ায় পর্যবেক্ষকরা রানটাইম চলাকালীন নিবন্ধন এবং নিবন্ধন করতে পারবেন। ইন্টারফেস ব্যবহার করা হয় বলে পর্যবেক্ষকদের থেকে পর্যবেক্ষণযোগ্য ডিকুয়াল করাও এটি একটি ভাল উপায়।


9

যদি সাক্ষাত্কারকারী পর্যবেক্ষক ডিজাইন প্যাটার্ন প্রয়োগ করতে বলে পর্যবেক্ষক ক্লাস এবং ইন্টারফেস ব্যবহার না করে করতে বলে, আপনি নিম্নলিখিত সহজ উদাহরণটি ব্যবহার করতে পারেন!

মাইওজারবার পর্যবেক্ষক ইন্টারফেস হিসাবে

interface MyObserver {

    void update(MyObservable o, Object arg);
}

মাইওবসরেবল অবজার্ভেবল ক্লাস হিসাবে

class MyObservable
{
    ArrayList<MyObserver> myObserverList = new ArrayList<MyObserver>();

    boolean changeFlag = false;

    public void notifyObservers(Object o)
    {
        if (hasChanged())
        {
            for(MyObserver mo : myObserverList) {
                mo.update(this, o);
            }
            clearChanged();
        }
    }


    public void addObserver(MyObserver o) {
        myObserverList.add(o);        
    }

    public void setChanged() {
        changeFlag = true;
    }

    public boolean hasChanged() {
        return changeFlag;
    }

    protected void clearChanged() {
        changeFlag = false;
    }

    // ...
}

মাইওবার্সার এবং মাই অবজারভেবলের সাথে আপনার উদাহরণ!

class MessageBoard extends MyObservable {
  private String message;

  public String getMessage() {
    return message;
  }

  public void changeMessage(String message) {
    this.message = message;
    setChanged();
    notifyObservers(message);
  }

  public static void main(String[] args) {
    MessageBoard board = new MessageBoard();
    Student bob = new Student();
    Student joe = new Student();
    board.addObserver(bob);
    board.addObserver(joe);
    board.changeMessage("More Homework!");
  }
}

class Student implements MyObserver {

  @Override
  public void update(MyObservable o, Object arg) {
    System.out.println("Message board changed: " + arg);
  }

}

5

"আমি নির্ধারণ করার চেষ্টা করেছি, কেন আমাদের অবশ্যই পর্যবেক্ষক এবং পর্যবেক্ষণযোগ্য প্রয়োজন"

পূর্ববর্তী উত্তরগুলি ইতিমধ্যে বর্ণিত হিসাবে, তারা পর্যবেক্ষণের জন্য স্বয়ংক্রিয়ভাবে বিজ্ঞপ্তিগুলি পেতে কোনও পর্যবেক্ষককে সাবস্ক্রাইব করার উপায় সরবরাহ করে।

উদাহরণস্বরূপ অ্যাপ্লিকেশন যেখানে এটি কার্যকর হতে পারে তা ডেটা বন্ডিং , আসুন আপনাকে কিছু ইউআই আছে যা কিছু ডেটা সম্পাদনা করে এবং আপনি ইউআইটি ডেটা আপডেট হওয়ার সময় প্রতিক্রিয়া দেখাতে চান, আপনি আপনার ডেটা পর্যবেক্ষণযোগ্য করতে পারেন এবং আপনার ইউআই উপাদানগুলি সাবস্ক্রাইব করতে পারেন তথ্যটি

নকআউট.জেএস একটি এমভিভিএম জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক যা একটি দুর্দান্ত শুরু করার টিউটোরিয়াল রয়েছে, আরও পর্যবেক্ষণযোগ্যদের ক্রিয়াকলাপ দেখার জন্য আমি টিউটোরিয়ালের মধ্য দিয়ে যাবার প্রস্তাব করছি। http://learn.knockoutjs.com/

আমি এই নিবন্ধটি ভিজ্যুয়াল স্টুডিও ২০০৮ এর শুরুর পৃষ্ঠাতেও পেয়েছি ( দ্য অবজার্ভার প্যাটার্নটি মডেল ভিউ কন্ট্রোলার (এমভিসি) বিকাশের ভিত্তি ) http://visualstudiomagazine.com/articles/2013/08/14/the-observer-pattern-in -net.aspx


3

আমি এখানে পর্যবেক্ষক নিদর্শনগুলির একটি সংক্ষিপ্ত বিবরণ লিখেছি: http://www.devcodenote.com/2015/04/design-patterns-observer-pattern.html

পোস্ট থেকে একটি স্নিপেট:

পর্যবেক্ষক প্যাটার্ন: এটি মূলত অবজেক্টগুলির মধ্যে একের মধ্যে একাধিক সম্পর্ক স্থাপন করে এবং আন্তঃনির্ভরশীল বস্তুর মধ্যে স্বচ্ছভাবে মিলিত নকশা করে।

পাঠ্যপুস্তক সংজ্ঞা: পর্যবেক্ষক প্যাটার্ন বস্তুর মধ্যে এক থেকে একাধিক নির্ভরতা সংজ্ঞায়িত করে যাতে যখন কোনও বস্তু স্থিতি পরিবর্তন করে, তখন তার সমস্ত নির্ভরশীলকে স্বয়ংক্রিয়ভাবে বিজ্ঞাপিত এবং আপডেট করা হয়।

উদাহরণস্বরূপ একটি ফিড বিজ্ঞপ্তি পরিষেবা বিবেচনা করুন। সাবস্ক্রিপশন মডেলগুলি পর্যবেক্ষণের ধরণটি বোঝার জন্য সেরা are


0

যখন অবজেক্ট প্যাটার্ন ব্যবহার করা হয় যখন বস্তুর মধ্যে এক থেকে একাধিক সম্পর্ক থাকে যেমন যদি কোনও বস্তুটি সংশোধন করা হয় তবে তার নির্ভরযোগ্য অবজেক্টগুলি স্বয়ংক্রিয়ভাবে জানাতে হবে।


0

জাভা 9 থেকে উভয় ইন্টারফেস অবচিত করা হয়েছে যার অর্থ আপনার আর এটি ব্যবহার করা উচিত নয়। জাভাতে পর্যবেক্ষক অবহেলিত দেখুন 9.। এর পরিবর্তে আমাদের কী ব্যবহার করা উচিত?

তবে, আপনি এখনও সেগুলি সম্পর্কে সাক্ষাত্কারের প্রশ্নগুলি পেতে পারেন ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.