মধ্যস্থতা বনাম পর্যবেক্ষক অবজেক্ট-ওরিয়েন্টেড ডিজাইন প্যাটার্নগুলি


95

আমার কিছু সমস্যা সমাধানের জন্য আমি গ্যাং অফ ফোর পড়ছি এবং মধ্যস্থতার ধরণটি পেরিয়ে এসেছি ।

আমি এর আগে কিছু প্রকল্পগুলি জিইআইআই করার জন্য আমার প্রকল্পগুলিতে পর্যবেক্ষক ব্যবহার করেছি। দুজনের মধ্যে খুব একটা পার্থক্য না পেয়ে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি। আমি পার্থক্যটি সন্ধান করতে ব্রাউজ করেছি কিন্তু আমার প্রশ্নের জন্য কোনও উপযুক্ত উত্তর খুঁজে পেলাম না।

কেউ আমাকে দু'জনের মধ্যে পার্থক্য করতে কিছু ভাল উদাহরণ দিয়ে স্পষ্টভাবে দু'টির নির্দিষ্ট করে দিতে সহায়তা করতে পারে?


4
এই প্রশ্নের কাছে স্থানান্তরিত করার জন্য আমার অনুরোধ Programmers.StackExchangeঅস্বীকার করা হয়েছিল, তবে আমি উত্তরটিতে আগ্রহী বলেই সেখানে একটি অনুরূপ পোস্ট করেছি। আপনি উত্তর কিছু আকর্ষণীয় খুঁজে পেতে পারেন। :)
রাচেল

জাভাস্ক্রিপ্ট উদাহরণগুলির জন্য, আপনি আমার অনুরূপ প্রশ্নের উত্তরটি একবার দেখে নিতে পারেন ।
অ্যালেক্স পাক্কা

আসল জিওএফ বইটি সম্বোধন করে যে বাস্তবায়ন বিভাগ পয়েন্ট # 8 এর অধীনে ব্যবহৃত প্যাটার্নের ChangeManagerজন্য একটি উদাহরণ দিয়ে । দেখা; paginas.fe.up.pt/~aaguiar/as/gof/hires/pat5g.htm#smplecodeObserverMediator
রবি-ই

উত্তর:


106

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

মধ্যস্থতাকারী প্যাটার্ন: এমন একটি বিষয় নির্ধারণ করুন যা কোনও বস্তুর সেট কীভাবে ইন্টারঅ্যাক্ট করে তা encapsulates। মধ্যস্থতাকারী একে অপরের সাথে স্পষ্টভাবে উল্লেখ না করে আলগা সংযোগকে উত্সাহ দেয় এবং এটি আপনাকে তাদের মিথস্ক্রিয়া স্বাধীনভাবে পরিবর্তিত করতে দেয়।

উত্স: dofactory

উদাহরণ:

পর্যবেক্ষক প্যাটার্ন: ক্লাস এ, এর সাথে নিবন্ধভুক্ত ও টাইপের শূন্য বা আরও বেশি পর্যবেক্ষক থাকতে পারে। যখন এ-তে কোনও কিছু পরিবর্তন করা হয় তখন এটি সমস্ত পর্যবেক্ষককে অবহিত করে।

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


পর্যবেক্ষক ব্যাখ্যা বরং পর্যবেক্ষক প্যাটার্ন চেয়ে কমান্ড প্যাটার্ন পাসে হবে বলে মনে হয়
Aun

41

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

এমন অনেকগুলি ক্ষেত্রে রয়েছে যখন আপনি পর্যবেক্ষক প্যাটার্নটি ব্যবহার করতে চান, তারা কী হ'ল কোনও বস্তুর জানা উচিত নয় যে অন্যান্য বস্তুগুলি তার স্থিতিটি পর্যবেক্ষণ করছে।

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

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

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


আমি এই শব্দটি "একক দায়িত্বের নীতি" খুঁজছিলাম।
stdout

37

পর্যবেক্ষক

1. ছাড়া

  • ক্লায়েন্ট 1 : আরে সাবজেক্ট , আপনি কখন পরিবর্তন করবেন?

  • ক্লায়েন্ট 2 : আপনি কখন সাবজেক্ট পরিবর্তন করেছেন ? আমি খেয়াল করিনি!

  • ক্লায়েন্ট 3 : আমি জানি যে সাবজেক্টটি পরিবর্তন হয়েছে।

2. সহ

  • ক্লায়েন্টরা নীরব।
  • একটু পরে ...
  • বিষয় : প্রিয় ক্লায়েন্ট , আমি বদলেছি!

মধ্যস্থতা

1. ছাড়া

  • ক্লায়েন্ট 1 : আরে ট্যাক্সি 1 , আমাকে কিছুটা নিয়ে যাও।
  • ক্লায়েন্ট 2 : আরে ট্যাক্সি 1 , আমাকে কিছুটা নিয়ে যাও।
  • ক্লায়েন্ট 1 : আরে ট্যাক্সি 2 , আমাকে কিছুটা নিয়ে যাও।
  • ক্লায়েন্ট 2 : আরে ট্যাক্সি 2 , আমাকে কিছুটা নিয়ে যাও।

2. সহ

  • ক্লায়েন্ট 1 : আরে ট্যাক্সিসেন্টার , দয়া করে আমাকে একটি ট্যাক্সি নিয়ে যান
  • ক্লায়েন্ট 2 : আরে ট্যাক্সিসেন্টার , দয়া করে আমাকে একটি ট্যাক্সি নিয়ে যান

4
আপনার মধ্যস্থতার উদাহরণ কারখানার প্যাটার্ন, মধ্যস্থতার প্যাটার্ন নয়
মোহাম্মদ করিমি

4
@ পিএমপিআর এটি মধ্যস্থতাকারী ডিজাইনের ধরণ। ট্যাক্সিকেন্দ্র ট্যাক্সি তৈরি করবে না, এটি কিছু উপায়ে ট্যাক্সিগুলি উপলভ্য করে (সম্ভবত ট্যাক্সি প্রতিটি ট্যাক্সি অপেক্ষা করবে আপনার পালা না হওয়া পর্যন্ত অপেক্ষা করে)
সিভা আর

14

এই নিদর্শনগুলি বিভিন্ন পরিস্থিতিতে ব্যবহার করা হয়:

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

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

এই উভয় নিদর্শন কম সংযোগ জন্য অনুমতি দেয়, কিন্তু একেবারে পৃথক।


7

একটি উদাহরণ দিয়ে যেতে দাও: আপনি দুটি অ্যাপ্লিকেশন তৈরি করতে চান তা বিবেচনা করুন:

  1. চ্যাট অ্যাপ্লিকেশন।
  2. জরুরী অ্যাম্বুলেন্স অপারেটর অ্যাপ্লিকেশন।

মধ্যস্থতাকারী

চ্যাট অ্যাপ্লিকেশনটি তৈরি করে আপনি mediatorডিজাইনের ধরণটি বেছে নেবেন ।

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

আমরা কেন পছন্দ করব mediator? এর সংজ্ঞাটি একবার দেখুন:

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

ম্যাজিক কীভাবে কাজ করে? প্রথমে আমরা চ্যাট মধ্যস্থতাকারী তৈরি করব এবং ব্যক্তিগণকে এটিতে নিবন্ধিত করবো, সুতরাং এটির সাথে প্রতিটি ব্যক্তির সাথে দুটি দিকনির্দেশক সংযোগ থাকবে (ব্যক্তি চ্যাট মধ্যস্থতাকারী ব্যবহার করে বার্তা পাঠাতে পারে যার ফলে এটির অ্যাক্সেস হতে পারে, এবং চ্যাট মধ্যস্থতাকারী অ্যাক্সেস করবে) যে ব্যক্তির আপত্তি আছে তার প্রাপ্ত পদ্ধতির কারণে এটিতেও এর অ্যাক্সেস রয়েছে)

function Person(name) {
    let self = this;
    this._name = name;
    this._chat = null;

    this._receive(from, message) {        
        console.log("{0}: '{1}'".format(from.name(), message));
    }
    this._send(to, message) {
        this._chat.message(this, to, message);
    }
    return {
        receive: (from, message) => { self._receive(from, message) },
        send: (to, message) => { self._send(to, message) },
        initChat: (chat) => { this._chat = chat; },
        name: () => { return this._name; }
    }
}


function ChatMediator() {
    let self = this;
    this._persons = [];    

    return {
        message: function (from, to, message) {
            if (self._persons.indexOf(to) > -1) {
                self._persons[to].receive(from, message);
            }
        },
        register: function (person) {
            person.initChat(self);
            self._persons.push(person);
        }
        unRegister: function (person) {
            person.initChat(null);
            delete self._persons[person.name()];
        }
    }
};

//Usage:
let chat = new ChatMediator();

let colton = new Person('Colton');
let ronan = new Person('Ronan');

chat.register(colton);
chat.register(ronan);

colton.send(colton, 'Hello there, nice to meet you');
ronan.send(ronan, 'Nice to meet you to');

colton.send(colton, 'Goodbye!');
chat.unRegister(colton);

পর্যবেক্ষক

911 কল অ্যাপ্লিকেশনটি তৈরি করে আপনি observerডিজাইনের ধরণটি বেছে নেবেন ।

  • প্রতিটি অ্যাম্বুলেন্সের observerঅবজেক্ট যখন জরুরি অবস্থা থাকে তখন অবহিত হওয়ার ইচ্ছা পোষণ করে , যাতে সে ঠিকানাটি চালিয়ে সহায়তা করতে পারে।
  • জরুরী অপারেটর observableপ্রত্যেকটি অ্যাম্বুলেন্সের রেফারেন্স রাখে observersএবং সাহায্যের প্রয়োজন হলে (বা ইভেন্ট উত্পন্ন করার সময়) তাদেরকে অবহিত করে।

আমরা কেন পছন্দ করব observer? এর সংজ্ঞাটি একবার দেখুন:

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

function AmbulanceObserver(name) {
    let self = this;
    this._name = name;
    this._send(address) {
        console.log(this._name + ' has been sent to the address: ' + address);
    }
    return {
        send: (address) => { self._send(address) },
        name: () => { return this._name; }
    }
}


function OperatorObservable() {
    let self = this;
    this._ambulances = [];    

    return {
        send: function (ambulance, address) {
            if (self._ambulances.indexOf(ambulance) > -1) {
                self._ambulances[ambulance].send(address);
            }
        },
        register: function (ambulance) {
            self._ambulances.push(ambulance);
        }
        unRegister: function (ambulance) {
            delete self._ambulances[ambulance.name()];
        }
    }
};

//Usage:
let operator = new OperatorObservable();

let amb111 = new AmbulanceObserver('111');
let amb112 = new AmbulanceObserver('112');

operator.register(amb111);
operator.register(amb112);

operator.send(amb111, '27010 La Sierra Lane Austin, MN 000');
operator.unRegister(amb111);

operator.send(amb112, '97011 La Sierra Lane Austin, BN 111');
operator.unRegister(amb112);

পার্থক্য:

  1. চ্যাট mediatorব্যক্তি বস্তুর মধ্যে দুই মুখী যোগাযোগও আছে (প্রেরণ ও গ্রহণ) কোথায় অপারেটর observableশুধুমাত্র একটি উপায় যোগাযোগ (এটা অ্যাম্বুলেন্স বলতে হয়েছে observerচালাতে কিন্তু শেষ করতে)।
  2. চ্যাটটি mediatorব্যক্তি ব্যক্তিদের মধ্যে তাদের মধ্যে ইন্টারঅ্যাক্ট করতে পারে (এটি সরাসরি যোগাযোগ না হলেও), অ্যাম্বুলেন্সগুলি observersকেবল অপারেটর observableইভেন্টগুলিতে নিবন্ধন করে ।
  3. প্রতিটি ব্যক্তি বস্তু চ্যাটে একটি রেফারেন্স রয়েছে mediator, এবং এছাড়াও চ্যাট mediatorব্যক্তির প্রতি এক রাখুন রেফারেন্স। যেখানে অ্যাম্বুলেন্স observerঅপারেটরের রেফারেন্স রাখে না observable, কেবল অপারেটর observableপ্রতিটি অ্যাম্বুলেন্সের রেফারেন্স রাখে observer

4
শেষ বিট সাহায্য করে। মধ্যস্থতাকারী এবং পর্যবেক্ষক উভয়ই একই লক্ষ্য অর্জন করেন, তবে মধ্যস্থতাকারী দ্বি-দিকনির্দেশক যোগাযোগ সক্ষম করে, তবে পর্যবেক্ষক কেবল একটি উপায় কাজ করে।
কিউইকম্ব 123

ঠিক
যেমনটি

আমি যখন শিরোনামটি পড়ি আমার কাছে এটি ঠিক বিপরীত পথে ছিল আসলে অ্যাম্বুলেন্স কল সেন্টার একজন মধ্যস্থতা - যিনি কল পান এবং তারপরে একটি অ্যাম্বুলেন্স, পুলিশ এবং ফায়ার ফাইটার প্রেরণ করেন এবং রেডিও স্টেশনের প্রতিটি অ্যাম্বুলেন্স হ্যাঁ একটি পর্যবেক্ষক - তারা রেডিওতে ইভেন্টের জন্য অপেক্ষা করেন যা তাদের স্পর্শ করে আড্ডায়: সার্ভারটি একজন মধ্যস্থতাকারী, প্রতিটি ক্লায়েন্ট - পর্যবেক্ষক আপনার মতানুযায়ী সঠিক?
মাকস

7

যদিও উভয়ই স্থিতিশীলভাবে পরিবর্তনগুলির কথা বলার জন্য সংগঠিত উপায়ে ব্যবহার করা হয় তবে তারা কাঠামোগত এবং শব্দার্থগতভাবে আইএমও থেকে কিছুটা আলাদা।

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

দেখুন, নিদর্শনগুলি ব্যবহারের প্রাথমিক উদ্দেশ্যটি বিকাশকারীদের মধ্যে একটি সাধারণ ভাষা তৈরি করা। সুতরাং, আমি যখন কোনও মধ্যস্থতাকারী দেখি তখন ব্যক্তিগতভাবে আমি একক দালাল / হাবের মাধ্যমে যোগাযোগের শব্দটি হ্রাস করার জন্য (বা এসআরপি প্রচার করতে) যোগাযোগ করার চেষ্টা করে এমন একাধিক উপাদান ব্যক্তিগতভাবে বুঝতে পারি এবং রাষ্ট্রীয় পরিবর্তনের ইঙ্গিত দেওয়ার ক্ষমতা রাখার ক্ষেত্রে প্রতিটি বস্তু সমানভাবে গুরুত্বপূর্ণ। উদাহরণস্বরূপ, বিমানবন্দরে আসার একাধিক বিমানের কথা ভাবেন of একে অপরের সাথে যোগাযোগের পরিবর্তে পাইলনের (মধ্যস্থতার) মাধ্যমে যোগাযোগ করা উচিত। (অবতরণ করার সময় একে অপরের সাথে যোগাযোগ করার জন্য 1000 এয়ারক্রাফ্টের কথা ভাবেন - এটি কোনও গোলমাল হবে)

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

আশা করি এটা পরিষ্কার হয়ে গেছে।


5

@ সিডিসি উদ্দেশ্যটির পার্থক্যটি দুর্দান্তভাবে ব্যাখ্যা করেছেন explained

আমি এর উপরে আরও কিছু তথ্য যুক্ত করব।

পর্যবেক্ষক : বিভিন্ন বস্তুর (বিভিন্ন শ্রেণীর উদাহরণ) এক বস্তুর ইভেন্টের বিজ্ঞপ্তি সক্ষম করে

মধ্যস্থতাকারী : নির্দিষ্ট শ্রেণি থেকে তৈরি বস্তুর সেটগুলির মধ্যে যোগাযোগকে কেন্দ্রিয় করুন।

চৌকস থেকে মধ্যস্থতা প্যাটার্ন গঠন :

এখানে চিত্র বর্ণনা লিখুন

মধ্যস্থতাকারী : সহপাঠীদের মধ্যে যোগাযোগের জন্য একটি ইন্টারফেস সংজ্ঞায়িত করে।

কলেজ : একটি বিমূর্ত শ্রেণি, যা সহকর্মীদের মধ্যে সংঘবদ্ধ হওয়ার ঘটনা সংজ্ঞায়িত করে

কংক্রিটমিডিয়েটর : কলেজি অবজেক্টের সমন্বয় করে সহযোগী আচরণ কার্যকর করে এবং এর সহকর্মীদের রক্ষণাবেক্ষণ করে

কংক্রিট কলেজলীগ : মিডিয়াটরের মাধ্যমে প্রাপ্ত বিজ্ঞপ্তি ক্রিয়াকলাপগুলি কার্যকর করে , যা অন্যান্য কলেজের দ্বারা উত্পাদিত হয়েছিল

একটি বাস্তব বিশ্বের উদাহরণ:

আপনি জাল টপোলজিতে কম্পিউটারের একটি নেটওয়ার্ক বজায় রাখছেন। যদি কোনও নতুন কম্পিউটার যুক্ত করা হয় বা বিদ্যমান কম্পিউটারটি সরিয়ে ফেলা হয় তবে network নেটওয়ার্কের অন্যান্য সমস্ত কম্পিউটারের এই দুটি ইভেন্ট সম্পর্কে জানা উচিত।

আসুন দেখুন মধ্যস্থতা প্যাটার্ন এটিতে কীভাবে খাপ খায়।

টুকিটাকি সংকেতলিপি:

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

/* Define the contract for communication between Colleagues. 
   Implementation is left to ConcreteMediator */
interface Mediator{
    public void register(Colleague colleague);
    public void unregister(Colleague colleague);
}
/* Define the contract for notification events from Mediator. 
   Implementation is left to ConcreteColleague
*/
abstract class Colleague{
    private Mediator mediator;
    private String name;

    public Colleague(Mediator mediator,String name){
        this.mediator = mediator;
        this.name = name;
    }
    public String toString(){
        return name;
    }
    public abstract void receiveRegisterNotification(Colleague colleague);
    public abstract void receiveUnRegisterNotification(Colleague colleague);    
}
/*  Process notification event raised by other Colleague through Mediator.   
*/
class ComputerColleague extends Colleague {
    private Mediator mediator;

    public ComputerColleague(Mediator mediator,String name){
        super(mediator,name);
    }
    public  void receiveRegisterNotification(Colleague colleague){
        System.out.println("New Computer register event with name:"+colleague+
        ": received @"+this);
        // Send further messages to this new Colleague from now onwards
    }
    public  void receiveUnRegisterNotification(Colleague colleague){
        System.out.println("Computer left unregister event with name:"+colleague+
        ":received @"+this);
        // Do not send further messages to this Colleague from now onwards
    }
}
/* Act as a central hub for communication between different Colleagues. 
   Notifies all Concrete Colleagues on occurrence of an event
*/
class NetworkMediator implements Mediator{
    List<Colleague> colleagues = new ArrayList<Colleague>();

    public NetworkMediator(){

    }

    public void register(Colleague colleague){
        colleagues.add(colleague);
        for (Colleague other : colleagues){
            if ( other != colleague){
                other.receiveRegisterNotification(colleague);
            }
        }
    }
    public void unregister(Colleague colleague){
        colleagues.remove(colleague);
        for (Colleague other : colleagues){
            other.receiveUnRegisterNotification(colleague);
        }
    }
}

public class MediatorPatternDemo{
    public static void main(String args[]){
        Mediator mediator = new NetworkMediator();
        ComputerColleague colleague1 = new ComputerColleague(mediator,"Eagle");
        ComputerColleague colleague2 = new ComputerColleague(mediator,"Ostrich");
        ComputerColleague colleague3 = new ComputerColleague(mediator,"Penguin");
        mediator.register(colleague1);
        mediator.register(colleague2);
        mediator.register(colleague3);
        mediator.unregister(colleague1);
    }
}

আউটপুট:

New Computer register event with name:Ostrich: received @Eagle
New Computer register event with name:Penguin: received @Eagle
New Computer register event with name:Penguin: received @Ostrich
Computer left unregister event with name:Eagle:received @Ostrich
Computer left unregister event with name:Eagle:received @Penguin

ব্যাখ্যা:

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

2

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

যদিও obeserver সূচিত সাবস্ক্রাইব রাষ্ট্র পরিবর্তন (নতুন ডিবি রেকর্ড সৃষ্টি, উদাহরণস্বরূপ) সম্পর্কে উপাদান, mediator কমান্ড নিবন্ধিত ব্যবসা লজিক প্রবাহ এর সাথে সম্পর্কিত কিছু (পাসওয়ার্ড রিসেট জন্য ব্যবহারকারীকে ইমেইল পাঠানোর) করতে উপাদান।

পর্যবেক্ষক

  • বিজ্ঞপ্তি পেতে গ্রাহকগণ সাবস্ক্রাইব করতে দায়বদ্ধ
  • বিজ্ঞপ্তি প্রক্রিয়াকরণ ব্যবসায়ের প্রবাহের অংশ নয়

মধ্যস্থতা

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