ব্রিজ প্যাটার্ন এবং অ্যাডাপ্টার প্যাটার্নের মধ্যে পার্থক্য


125

ব্রিজ এবং অ্যাডাপ্টারের নিদর্শনগুলির মধ্যে পার্থক্য কী?


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


এখানে কোনও ব্যাখ্যা ডিজাইন প্যাটার্নগুলির
lececeldeiro

উত্তর:


173

"অ্যাডাপ্টার তাদের নকশা করার পরে জিনিসগুলিকে কাজ করে তোলে; ব্রিজ তাদের তৈরি করার আগে তাদের কাজ করে দেয় [[GoF, p219]"

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

public class SuperWeaponsArray {
  /*...*/

  public void destroyWorld() {
    for (Weapon w : armedWeapons) {
      w.fire();
    }
  }
}

গ্রেট। আমরা যদি না বুঝতে পারি যে আমাদের অস্ত্রাগারে এমন একটি পারমাণবিক ডিভাইস রয়েছে যা অস্ত্র ইন্টারফেসে রূপান্তরটির ব্যাপকভাবে পূর্বাভাস দেয়। তবে আমরা এখানে কাজ করা সত্যিই পছন্দ করব ... সুতরাং আমরা কী করব ... এটি আটকে দিন!

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


সেতু প্যাটার্ন কিছু সামনে বাস্তবায়ন - আপনি জানেন আপনি দুই লম্ব শ্রেণীবিন্যাসের আছে, এটা ইন্টারফেস এবং এমনভাবে যে আপনার ক্লাস একটি উন্মাদ সংখ্যা পাবেন না বাস্তবায়ন decouple করার জন্য একটি উপায় প্রদান করে। আসুন বলি আপনার কাছে রয়েছে:

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

মেমরিম্যাপড উইন্ডোফাইলে ফাইল মেমরিম্যাপডডিনক্সফিল ডিরেক্টরি


9
ডাউনভোটেড, আপনি কি আরও বিমূর্ত কোড তালিকা ব্যবহার করতে পারেন? উদাহরণটি খুব নির্দিষ্ট এবং বিভ্রান্তিকর।

36
@ বাড়ির উপরে উত্সাহিত, উদাহরণ কোডটি আসলে এই নয় যে উত্তরটি এই পয়েন্টটির উত্তর দেয়। সাবধান পাঠকদের জন্য পর্যাপ্ত পয়েন্টার এর নিদর্শন পার্থক্য, তাই সর্বেসর্বা শুরু করার জন্য - এটা হল একটি ভাল উত্তর।
ভিক্টর ফারাজডাগি

15
আপনি কি ব্রিজ প্যাটার্নের জন্য কিছু প্রকৃত কোড উদাহরণ সরবরাহ করতে পারেন?
যায়েম হাবলুটজেল

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

3
"অ্যাডাপ্টার ডিজাইন করার পরে জিনিসগুলিকে কাজ করে তোলে; ব্রিজ তাদের তৈরি হওয়ার আগে তাদের কাজ করে তোলে।" আমি যে বইটি পড়েছি সেটিতে নির্দিষ্ট করে দেওয়া হয়নি, তাই দু'টি আলাদা করা শক্ত ছিল। আমি অনুমান করি জিওএফ পড়া সর্বোপরি প্রচেষ্টার পক্ষে মূল্যবান ...
আলেকজান্ডার ডার্ক

15

http://en.wikipedia.org/wiki/Adapter_pattern

অ্যাডাপ্টার প্যাটার্নটি আপনার বিদ্যমান কোডটি আরও নতুন সিস্টেম বা ইন্টারফেসের সাথে কাজ করার বিষয়ে আরও বেশি।

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

http://en.wikipedia.org/wiki/Bridge_pattern

ব্রিজ প্যাটার্নটি আপনাকে সম্ভবত একটি অ্যালগরিদম বা সিস্টেমের বিকল্প বাস্তবায়ন করতে দেয়।

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

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


14

নাটক:

  1. এটি একটি কাঠামোগত নিদর্শন
  2. দুটি বেমানান ইন্টারফেসের সাথে কাজ করা কার্যকর

ইউএমএল ডায়াগ্রাম: কারখানার নিবন্ধ থেকে :

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

লক্ষ্য : ক্লায়েন্ট ব্যবহার করে এমন ডোমেন-নির্দিষ্ট ইন্টারফেসটিকে সংজ্ঞায়িত করে।

অ্যাডাপ্টার : ইন্টারফেসটি লক্ষ্য ইন্টারফেসের সাথে অ্যাডাপ্টিকে অ্যাডাপ্ট করে

অভিযোজক : একটি বিদ্যমান ইন্টারফেস সংজ্ঞায়িত করে যা অ্যাডাপ্টিংয়ের প্রয়োজন।

ক্লায়েন্ট : লক্ষ্য ইন্টারফেসের সাথে সম্মত অবজেক্টগুলির সাথে সহযোগিতা করে।

উদাহরণ:

স্কোয়ার এবং আয়তক্ষেত্র দুটি পৃথক আকার এবং এগুলির প্রত্যেকের প্রাপ্তি অঞ্চল () পৃথক পৃথক পদ্ধতির প্রয়োজন। তবে তবুও স্কয়ারটি কিছু বৈশিষ্ট্য রূপান্তর করে আয়তক্ষেত্রের ইন্টারফেসে কাজ করে।

public class AdapterDemo{
    public static void main(String args[]){
        SquareArea s = new SquareArea(4);
        System.out.println("Square area :"+s.getArea());
    }
}

class RectangleArea {
    public int getArea(int length, int width){
        return length * width;
    }
}

class SquareArea extends RectangleArea {

    int length;
    public SquareArea(int length){
        this.length = length;
    }
    public int getArea(){
        return getArea(length,length);
    }
}

সেতু:

  1. এটি কাঠামোগত নিদর্শন
  2. এটি এর বাস্তবায়ন থেকে বিমূর্তিকে ডিউপল করে এবং উভয়ই স্বতন্ত্রভাবে পৃথক হতে পারে
  3. উত্তরাধিকারের জায়গায় রচনাটি ব্যবহৃত হয়েছে বলে এটি সম্ভব

সম্পাদনা: (@ কোয়েস্টের পরামর্শ অনুসারে)

এই প্যাটার্নে আপনার চারটি উপাদান রয়েছে।

  1. বিমূর্ততা : এটি একটি ইন্টারফেস সংজ্ঞায়িত করে

  2. রিফাইন্ডএবস্ট্রাকশন : এটি বিমূর্তি প্রয়োগ করে:

  3. প্রয়োগকারী : এটি বাস্তবায়নের জন্য একটি ইন্টারফেসকে সংজ্ঞায়িত করে

  4. কংক্রিটআইপ্লিমেন্টার : এটি প্রয়োগকারী ইন্টারফেস প্রয়োগ করে।

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

Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();

gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();

সম্পর্কিত পোস্ট:

আপনি কখন ব্রিজ প্যাটার্ন ব্যবহার করবেন? এটি অ্যাডাপ্টারের প্যাটার্ন থেকে কীভাবে আলাদা?

মূল পার্থক্য: উত্স তৈরির নিবন্ধ থেকে

  1. অ্যাডাপ্টার জিনিসগুলি ডিজাইন করার পরে কাজ করে তোলে; ব্রিজ তাদের আগে তাদের কাজ করে তোলে।
  2. ব্রিজটি আপ-ফ্রন্টটি ডিজাইন করা হয়েছে যাতে বিমূর্তি প্রয়োগ এবং প্রয়োগটি স্বতন্ত্রভাবে পরিবর্তিত হয়। সম্পর্কিত না হওয়া ক্লাসগুলি একসাথে কাজ করতে অ্যাডাপ্টার পুনঃনির্মাণযোগ্য।

উত্তরে ডক্স থেকে গাড়ী / ট্রাক / গিয়ার উদাহরণ অন্তর্ভুক্ত করুন। দুর্দান্ত উদাহরণ এবং উপমা।
Quasoft

8

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


যদিও, এই প্রশ্নের ক্ষেত্রের বাহ্যত আপাতদৃষ্টিতে, ফ্যাসেডের বিপরীতে অ্যাডাপ্টার এবং ব্রিজ ওজন করা খুব উপযুক্ত হতে পারে।
কোডি

1

ব্রিজ অ্যাডাপ্টার উন্নত করা হয়। ব্রিজটিতে অ্যাডাপ্টার অন্তর্ভুক্ত থাকে এবং এতে অতিরিক্ত নমনীয়তা যুক্ত হয়। নিদর্শনগুলির মধ্যে রবীন্দ্রের উত্তর মানচিত্র থেকে উপাদানগুলি এখানে রয়েছে:

      Adapter  |    Bridge
    -----------|---------------
    Target     | Abstraction
    -----------|---------------
               | RefinedAbstraction
               |
               |   This element is Bridge specific. If there is a group of 
               |   implementations that share the same logic, the logic can be placed here.
               |   For example, all cars split into two large groups: manual and auto. 
               |   So, there will be two RefinedAbstraction classes.
    -----------|--------------- 
    Adapter    | Implementor
    -----------|---------------
    Adaptee    | ConcreteImplementor

1

শীর্ষের উত্তরে, @ জেমস জিওএফ, পৃষ্ঠা 219 এর একটি বাক্য উদ্ধৃত করেছে I আমি মনে করি এটি এখানে সম্পূর্ণ ব্যাখ্যা পুনর্নির্মাণের পক্ষে সার্থক।

অ্যাডাপ্টার বনাম ব্রিজ

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

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

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


0

মনে করুন আপনি একটি (জেনেরিক / বিমূর্ত) অঙ্কন কার্যকারিতা এবং একটি বৃত্ত যিনি আকার প্রয়োগ করেন তার সাথে একটি বিমূর্ত শেপ শ্রেণি রয়েছে ব্রিজ প্যাটার্নটি কার্যকরভাবে প্রয়োগকরণ (সার্কেলের অঙ্কন) এবং জেনেরিক / বিমূর্ত কার্যকারিতা (শেপ শ্রেণিতে অঙ্কন )কে দ্বিগুণ করার জন্য একটি দ্বিমুখী বিমূর্ততা পদ্ধতি approach

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

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

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