নকশার ধরণ - পর্যবেক্ষক নিদর্শনগুলির একটি দ্রুত গাইড quick

পর্যবেক্ষক প্যাটার্ন একটি খুব সাধারণভাবে ব্যবহৃত প্যাটার্ন। আসলে, এটি এত সাধারণ যে অনেক প্রোগ্রামিং ভাষা / গ্রন্থাগারগুলিতে মানক করা হচ্ছে। জাভাতে এটি ইনসিভা.ইটি.ল.অবার্সার বিদ্যমান (জাভা 9 এ অবমূল্যায়িত)। পাইথনে এটি এপিআইপি ইনস্টল প্যাটার্ন-পর্যবেক্ষকের মতোই কাছাকাছি। সি ++ তে আমরা মাঝে মাঝে বুস্ট লাইব্রেরি ব্যবহার করতে পারি, আরও # স্পষ্ট <বিস্ট / সিগন্যাল 2 hpp> অন্তর্ভুক্ত। তবে এটি কাস্টম-মেড সমাধান হিসাবে শিল্পে ব্যাপকভাবে ব্যবহৃত হয়। এটি সঠিকভাবে ব্যবহার করতে এবং এর জটিলতা বোঝার জন্য আমাদের এটিকে ডুব দিয়ে অন্বেষণ করতে হবে।

আচরণগত নকশা নিদর্শনগুলির মধ্যে পর্যবেক্ষক নিদর্শনকে শ্রেণিবদ্ধ করা হয়। আচরণগত নকশার ধরণগুলি শ্রেণি / অবজেক্টের মধ্যে যোগাযোগের সাথে সর্বাধিক বিশেষভাবে উদ্বিগ্ন। [ডিজাইন প্যাটার্নস দ্বারা সহজভাবে ব্যাখ্যা করা হয়েছে]

একটি পর্যবেক্ষক প্যাটার্ন কি? একটি হাঁটা মনিটর ছাড়াও যা অ্যানালগ টেলিভিশন সম্প্রচারিত করে (ছবিতে)। প্যাটার্নটির লক্ষ্য হ'ল একের মধ্যে একাধিক সম্পর্কের সংজ্ঞা দেওয়া যেমন যখন যখন কোনও বস্তুর স্থিতি পরিবর্তন হয় তখন অন্যগুলি স্বয়ংক্রিয়ভাবে অবহিত এবং আপডেট হয়। আরও স্পষ্টভাবে, এটি সিস্টেমে সংঘটিত ঘটনা সম্পর্কে অবহিত হতে চায়। ধাঁধাটির টুকরো তিনটি পদক্ষেপে একসাথে রাখি।

পদক্ষেপ 1 - কীওয়ার্ড

কী-ওয়ার্ডস সংজ্ঞা দেওয়া তাড়াতাড়ি এই গাইডগুলির এই সিরিজের গোপন রেসিপি। এই পদ্ধতিটি আমাকে সত্যই নকশার নিদর্শনগুলি বুঝতে, তাদেরকে আমার মনে হার্ডকোড করতে এবং অন্যান্য নকশার নিদর্শনগুলির মধ্যে পার্থক্য বোঝার ক্ষেত্রে সহায়তা করেছিল।

  1. বিষয়: এটি তথ্য, ডেটা বা ব্যবসায়িক যুক্তি রক্ষক হিসাবে বিবেচিত হয়।
  2. নিবন্ধন / সংযুক্তি: পর্যবেক্ষকরা বিষয়টিতে নিজেকে নিবন্ধভুক্ত করেন কারণ কোনও পরিবর্তন হলে তারা বিজ্ঞপ্তি চান।
  3. ইভেন্ট: ইভেন্টগুলি বিষয়টিতে ট্রিগার হিসাবে কাজ করে যাতে সমস্ত পর্যবেক্ষককে অবহিত করা হয়।
  4. বিজ্ঞপ্তি: বাস্তবায়নের উপর নির্ভর করে বিষয়টি পর্যবেক্ষকদের কাছে তথ্য "ধাক্কা" দিতে পারে বা পর্যবেক্ষকগণ যদি তাদের বিষয় থেকে তথ্য প্রয়োজন হয় তবে তাদের "টানতে" পারে।
  5. আপডেট: পর্যবেক্ষকরা অন্য পর্যবেক্ষকদের থেকে তাদের রাজ্য স্বাধীনভাবে আপডেট করেন তবে ট্রিগারযুক্ত ইভেন্টের উপর নির্ভর করে তাদের রাজ্যটি পরিবর্তিত হতে পারে।

পদক্ষেপ 2 - ডায়াগ্রাম

এটিকে কিছুটা সহজ করার জন্য এই নকশাটিকে বিভিন্ন শ্রেণিতে বিভক্ত করুন।

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

পদক্ষেপ 3 - উদাহরণ অনুসারে কোড

আমি আমার গিট সংগ্রহস্থল "আন্দ্রেয়াস পোইয়াস" বা নীচের স্নিপেটগুলি (প্রদত্ত ক্রমে) থেকে ক্লাস অনুসারে কোড ক্লাসটি অনুলিপি করতে এবং সি ++ শেল, জডুডল, অনলাইন জিডিবি এবং চালিত যে কোনও অনলাইন সি ++ সম্পাদকের মধ্যে এটি আটকে দিতে পরামর্শ দেব and এটি আউটপুট পর্যবেক্ষণ। তারপরে নীচের মতামত বা বিবরণ পড়ুন। আপনার সময় নিন, এটি পুরোপুরি পড়ুন (এর অর্থ এক মিনিট, কম নয় এবং বেশি নয়)।

উদাহরণ: একটি ফুটবল খেলা বিবেচনা করুন। অনেক সমর্থক খেলাটি দেখছেন। আমরা সমর্থকদের বয়স এবং যুবা হিসাবে দুটি বিভাগে বিভক্ত করেছি। যখন তাদের দল একটি লক্ষ্য অর্জন করে তখন সমর্থকরা তাদের বয়স এবং তাদের উত্তেজনার স্তর অনুযায়ী আলাদাভাবে প্রতিক্রিয়া দেখায়।
এখন, পর্যবেক্ষক প্যাটার্নের জন্য ব্যবহৃত পদগুলির সাথে কথা বলি:

  • গেমটি বিষয় এবং সমর্থকরা পর্যবেক্ষক।
  • সমস্ত পর্যবেক্ষকরা এই বিষয়ের সাথে সংযুক্ত / নিবন্ধিত এবং তাদের ফুটবল দলের স্কোর হওয়ার পরে তাদের অবহিত করা হয় (ট্রিগার-ইভেন্টটি যদি তাদের দলের স্কোর হয়)।
  • প্রাপ্ত বিজ্ঞপ্তির উপর নির্ভর করে পর্যবেক্ষকরা তাদের আচরণ আপডেট করে।

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

# অন্তর্ভুক্ত 
# অন্তর্ভুক্ত <ভেক্টর>
নেমস্পেস স্ট্যান্ড ব্যবহার করে;
ক্লাস সাবজেক্ট {
    ভেক্টর <ক্লাস অবজারভার *> পর্যবেক্ষক;
    বোল স্কোর; // ট্রিগার ইভেন্ট
প্রকাশ্য:
    // নিবন্ধক পর্যবেক্ষক
    শূন্য সংযুক্তি (পর্যবেক্ষক * obs) {
        observers.push_back (obs);
    }
   
   // এটি ইভেন্ট
   // স্কোর করে সেট করুন এবং সমস্ত পর্যবেক্ষককে অবহিত করুন
   অকার্যকর সেটস্করড (বুল স্কোর) {
      স্কোর = স্কোর;
      জ্ঞাপন করা();
   }
বুল getScored () {
      রিটার্ন রান;
   }
   // অবহিতকরণ বাস্তবায়ন আরও নিচে
   // যাতে স্ক্রিপ্টটি সংকলন করে চলে
   অকার্যকর বিজ্ঞপ্তি ();
};

পর্যবেক্ষক
এই ক্লাসটি যার সাথে নিবন্ধিত তা নির্ভর করে dependent কংক্রিট পর্যবেক্ষকরা প্রাথমিক হয়ে গেলে তারা নিজেকে সাবজেক্টের সাথে সংযুক্ত করে। এই উদাহরণে, প্রতিটি পর্যবেক্ষকের অবস্থা হ'ল তার উত্তেজনাপূর্ণ খেলাটি সম্পর্কে।

শ্রেণি পর্যবেক্ষক
{
    বিষয় * সাবজ;
    int উত্তেজনা // অবস্থা
  প্রকাশ্য:
    পর্যবেক্ষক (সাবজেক্ট * মোড, এক্স এক্সলভেল)
    {
        subj = মোড;
        উত্তেজনা লেভেল = excLevel;
        // পর্যবেক্ষকগণ সাবজেক্টের সাথে নিবন্ধিত / সংযুক্ত হন
        subj-> সংযুক্ত (এই);
    }
    ভার্চুয়াল শূন্য আপডেট () = 0;
  সংরক্ষিত:
    বিষয় * getSubject () {
       রিটার্ন সাবজ;
    }
    অকার্যকর সেটএক্সিটমেন্টমেন্ট লেভেল (ইন এক্সলভিল) {
       উত্তেজনা লেভেল = excLevel;
    }
    int getExcitementLevel () {
       উত্তেজনা ফিরে
    }
};

এটি সাবজেক্ট :: বিজ্ঞপ্তি () ঘোষণা এবং এর কাজ হিসাবে আমরা উল্লেখ করেছি যে সমস্ত পর্যবেক্ষকদের তাদের অবস্থা আপডেট করার জন্য অবহিত করা।

অকার্যকর বিষয় :: অবহিত () {
  (int i = 0; i <निरीक्षक.সাইজ (); i ++) এর জন্য
    পর্যবেক্ষক [আমি] -> আপডেট ();
}

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

ওল্ড_সনক্রিটঅবার্সার শ্রেণি: সর্বজনীন পর্যবেক্ষক
{
   প্রকাশ্য:
     // সাবজেক্টের সাথে রেজিস্ট্রেশন করতে পিতা অভিভাবককে কল করুন
     ওল্ড_কন্ট্রিটসবার্সার (সাবজেক্ট * মোড, ইন্ট ডিভি)
        : পর্যবেক্ষক (মোড, ডিভি)}}
     // বয়স্ক ব্যক্তিদের জন্য, যদি উত্তেজনার স্তর থাকে
     // তাদের হার্ট অ্যাটাকের ঝুঁকি রয়েছে 150 এর বেশি run
     অকার্যকর আপডেট ()
     {
        বুল স্কোর = getSubject () -> getScored ();
        সেটএকসিটিমেন্ট লেভেল (getExcitementLevel () + 1);
        যদি (স্কোর &&ExcitementLevel ()> 150)
        {
          কাউট << "ওল্ড পর্যবেক্ষকের দল রান করেছে !!"
               << "তার উত্তেজনার মাত্রা"
               << এক্সসিটিমেন্ট লেভেল পান ()
               << "হার্ট অ্যাটাক থেকে সতর্ক থাকুন!" << শেষ;
        } অন্য {
          কোট << "দল স্কোর করতে পারেনি Ye
               << শেষ;
        }
    } // শেষ আপডেট ()
};
ইয়ং_সনক্রিটঅবার্সার ক্লাস: পাবলিক অবজারভার
{
   প্রকাশ্য:
     // সাবজেক্টের সাথে রেজিস্ট্রেশন করতে পিতা অভিভাবককে কল করুন
     ইয়াং_ কনক্রিটঅবসভার (সাবজেক্ট * মোড, ইন্ট ডিভি)
       : পর্যবেক্ষক (মোড, ডিভি)}}
     // বয়স্ক ব্যক্তিদের জন্য, যদি উত্তেজনার স্তর থাকে
     // তাদের হার্ট অ্যাটাকের ঝুঁকি রয়েছে 100 এর বেশি
     অকার্যকর আপডেট ()
     {
        বুল স্কোর = getSubject () -> getScored ();
        সেটএকসিটিমেন্ট লেভেল (getExcitementLevel () + 1);
        যদি (স্কোর &&ExcitementLevel ()> 100)
        {
          কাউট << "তরুণ পর্যবেক্ষক দল স্কোর করেছে !!"
               << "তার উত্তেজনার মাত্রা"
               << এক্সসিটিমেন্ট লেভেল পান ()
               << "পান করবেন না এবং ড্রাইভ করবেন না!" << শেষ;
        } অন্য {
          কোট << "দল স্কোর করতে পারেনি Ye ইয়াহ উদ্বেগের কিছু নেই"
               << শেষ;
       }
    } // শেষ আপডেট ()
};

প্রধান ফাংশন
কংক্রিট পর্যবেক্ষকরা তাদের সাবজেক্ট দৃষ্টান্তে নিবন্ধন করে। তাদের রাষ্ট্রটি উত্তেজনার স্তর যা দ্বিতীয় প্যারামিটার। ইভেন্টটি যখন "subj.setScored (সত্য)" ট্রিগার করা হয়, তখন সাবজেক্ট :: নোটিফাই () নিবন্ধিত পর্যবেক্ষকদের আপডেট করার জন্য ডাকা হয়। নীচের দৃশ্যে, আমাদের তিনটি পর্যবেক্ষক রয়েছেন, ইয়ংওবস 1 এই অতিরিক্ত পানীয় এবং গাড়ি চালানোর ঝুঁকি চালায়, ওল্ডঅবস 1 এছাড়াও রানকে আলাদা ঝুঁকির (হার্ট অ্যাটাকের) অতিরিক্ত ছাড়িয়ে গেছে। অবশেষে, ইয়ংবঅবস 2 যিনি প্রথম হিসাবেও তরুণ, তিনি অত্যধিক বর্ধিত না হওয়ায় চিন্তার কিছু নেই nothing

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে তিনটি পর্যবেক্ষক তাদের রাষ্ট্র (উত্তেজনার স্তর) এবং তাদের ধরণের (তরুণ বা বৃদ্ধ) এর ভিত্তিতে স্বতন্ত্রভাবে আপডেট হয়েছিলেন।
int প্রধান () {
   বিষয় সাবজ;
   ইয়ং_ কনক্রিটঅবসভার ইয়ার ওবস 1 (& সাবজ, 100);
   Old_ConcretObserver oldObs1 (& subj, 150);
   ইয়ং_ কনক্রিটঅবসভার ইয়ার ওবস 2 (& subj, 52);
   subj.setScored (সত্য);
}
// আউটপুট
// ইয়াং অবজারভারের দল রান করেছে !! তার উত্তেজনার মাত্রা 101
// পান করবেন না এবং ড্রাইভ করবেন না !!
// ওল্ড অবজারভারের দল রান করেছে !! তার উত্তেজনার স্তর 151 ঘড়ি
হার্ট অ্যাটাকের বাইরে! দল স্কোর করেনি।
// ইয়েহে চিন্তার কিছু নেই

পর্যবেক্ষক নিদর্শন ব্যবহারের জন্য কয়েকটি সুবিধা রয়েছে এবং এই প্যাটার্নটি যখন [পাইথন ডিজাইনের প্যাটার্নগুলি শিখতে হবে] তখন কয়েকটি বিষয় উল্লেখ করতে হবে।

  • অবজার্ভার প্যাটার্ন একটি নকশা সরবরাহ করে যেখানে সাবজেক্ট এবং পর্যবেক্ষক আলগাভাবে মিলিত হয়। সাবজেক্টটি কংক্রিটঅবার্সার ক্লাস সম্পর্কে জানার দরকার নেই। যে কোনও নতুন পর্যবেক্ষককে যে কোনও সময় যুক্ত করা যেতে পারে। নতুন পর্যবেক্ষক যুক্ত হওয়ার পরে সাবজেক্টটি সংশোধন করার দরকার নেই। পর্যবেক্ষক এবং বিষয়গুলি আবদ্ধ নয় এবং একে অপরের থেকে স্বতন্ত্র, সুতরাং সাবজেক্ট বা পর্যবেক্ষকের পরিবর্তনগুলি একে অপরকে প্রভাবিত করবে না।
  • রচনাটির কোনও বিকল্প নেই, কারণ পর্যবেক্ষক ইন্টারফেসটি তাত্ক্ষণিকভাবে চালু করা যেতে পারে।
  • যদি পর্যবেক্ষকের অপব্যবহার করা হয় তবে এটি সহজেই জটিলতা যুক্ত করতে পারে এবং পারফরম্যান্সের সমস্যার সমাধান করতে পারে।
  • বিজ্ঞপ্তিগুলি অবিশ্বাস্য হতে পারে এবং এর ফলে বর্ণের পরিস্থিতি বা অসঙ্গতি হতে পারে।

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

নকশার ধরণগুলির জন্য অন্যান্য দ্রুত-গাইড:

  1. নকশার প্যাটার্নস - বিমূর্ত কারখানার একটি দ্রুত গাইড।
  2. নকশার প্যাটার্নস - ব্রিজ প্যাটার্নের একটি দ্রুত গাইড।
  3. ডিজাইন প্যাটার্নস - বিল্ডার প্যাটার্নের একটি দ্রুত গাইড।
  4. নকশার প্যাটার্নস - সজ্জা প্যাটার্নগুলির একটি দ্রুত গাইড।
  5. নকশা প্যাটার্নস - মুখোমুখি প্যাটার্নের একটি দ্রুত গাইড।
  6. নকশার প্যাটার্নস - পর্যবেক্ষক প্যাটার্নগুলির একটি দ্রুত গাইড।
  7. নকশার প্যাটার্নস - সিঙ্গলটন প্যাটার্নের একটি দ্রুত গাইড।