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


154

ব্রিজ প্যাটার্নটি কেউ কি কখনও বাস্তব বিশ্বের অ্যাপ্লিকেশন ব্যবহার করেছে? যদি তা হয় তবে কীভাবে আপনি এটি ব্যবহার করেছেন? এটি কি আমি, বা এটি কেবলমাত্র অ্যাডাপ্টার প্যাটার্নটিতে সামান্য নির্ভরতার ইনজেকশনটি মিশ্রণে ফেলে দেওয়া হয়? এটি কি সত্যই নিজস্ব প্যাটার্নের প্রাপ্য?


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

GoF বই সরাসরি এই প্রশ্নের উত্তর।
jaco0646

উত্তর:


76

ব্রিজ প্যাটার্নের একটি ক্লাসিক উদাহরণ কোনও ইউআই পরিবেশে আকারগুলির সংজ্ঞাতে ব্যবহৃত হয় ( ব্রিজ প্যাটার্ন উইকিপিডিয়া এন্ট্রি দেখুন )। সেতু প্যাটার্ন একটি হল যৌগিক এর টেমপ্লেট এবং স্ট্র্যাটেজি নিদর্শন।

ব্রিজ প্যাটার্নে অ্যাডাপ্টার প্যাটার্নের কিছু দিক এটি একটি সাধারণ দৃশ্য। যাইহোক, এই নিবন্ধ থেকে উদ্ধৃত :

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


1
ব্রিজের টেম্পলেট বা কৌশলগুলির সাথে কোনও সম্পর্ক নেই। ব্রিজ একটি কাঠামোগত নিদর্শন। টেম্পলেট এবং কৌশল আচরণগত নিদর্শন are
jaco0646

249

ফেডেরিকো এবং জন এর উত্তরগুলির সংমিশ্রণ রয়েছে ।

কখন:

                   ----Shape---
                  /            \
         Rectangle              Circle
        /         \            /      \
BlueRectangle  RedRectangle BlueCircle RedCircle

রিফ্যাক্টর:

          ----Shape---                        Color
         /            \                       /   \
Rectangle(Color)   Circle(Color)           Blue   Red

6
কেন আপনি রঙের জন্য উত্তরাধিকার করবেন?
ভ্যানোলো

10
@ ভ্যানোলো কারণ রঙটি একটি ইন্টারফেস এবং নীল, লাল রঙের কংক্রিট রঙ
ওয়েল্টসচেজার্জ

3
এটি কেবল একটি রিফ্যাক্টরিং। ব্রিজ প্যাটার্নের অভিপ্রায়: "এর প্রয়োগ থেকে বিমূর্তিটি দ্বিগুণ করুন যাতে দুটি স্বতন্ত্রভাবে পৃথক হতে পারে।" বিমূর্ততা কোথায় এবং এখানে বাস্তবায়ন কোথায়?
ক্ল্যাপস

1
আয়তক্ষেত্র (রঙ) নীল রঙের আয়তনের জিনিস নয়?
আন্তন শ্যাচস্তনি

2
@ ক্ল্যাপস, বিমূর্তি সম্পত্তিটির "শেপ.ক্লোলার", সুতরাং রেড এবং ক্লাস ব্লু শ্রেণি বাস্তবায়ন হয়, এবং রঙিন ইন্টারফেস সেতু হয়।
পুনরায়

230

ব্রিজ প্যাটার্নটি পুরানো পরামর্শের প্রয়োগ, "উত্তরাধিকারের চেয়ে বেশি রচনা পছন্দ করুন"। একে অপরের সাথে অরথোগোনাল এমনভাবে বিভিন্ন সময় সাবক্লাস করার সময় এটি সহজ হয়ে যায়। বলুন আপনাকে অবশ্যই রঙিন আকারের শ্রেণিবিন্যাস বাস্তবায়ন করতে হবে। আপনি আয়তক্ষেত্র এবং বৃত্ত সহ সাবক্লাস শেপ এবং তারপরে রেডরেটাঙ্গল, ব্লু রেক্টাঙ্গেল এবং গ্রিনআরেক্টাঙ্গলের সাথে সাবক্লাস আয়তক্ষেত্র এবং বৃত্তের জন্য একই না, আপনি কি করবেন? আপনি প্রতিটি আকৃতি বলতে পছন্দ করেন রয়েছে একটি রঙ এবং রঙের একটি অনুক্রমের বাস্তবায়ন, এবং যে সেতু প্যাটার্ন। ঠিক আছে, আমি "রঙের শ্রেণিবিন্যাস" প্রয়োগ করব না, তবে আপনি ধারণাটি পেয়ে যান ...


1
এই ব্যাখ্যার গ্রাফিকাল চিত্রের জন্য নীচে অ্যান্টন শ্যাচস্তনিই চিত্রটিও দেখুন।
NomadNumerique

2
আমি মনে করি না যে কোনও রঙ বাস্তবায়ন শ্রেণিবিন্যাসের জন্য একটি ভাল উদাহরণ, এটি বরং বিভ্রান্তিকর। জিওএফ দ্বারা "নকশার ধরণগুলি" ব্রিজ প্যাটার্নের একটি ভাল উদাহরণ রয়েছে, যেখানে বাস্তবায়ন প্ল্যাটফর্ম নির্ভর: আইবিএমের প্রধানমন্ত্রী,
ইউএনএক্সএক্স

215

কখন:

        A
     /     \
    Aa      Ab
   / \     /  \
 Aa1 Aa2  Ab1 Ab2

রিফ্যাক্টর:

     A         N
  /     \     / \
Aa(N) Ab(N)  1   2

3
আমি মনে করি এটি নিদর্শনগুলির জন্য খুব ব্যবহারিক পদ্ধতির: 1) সাবপটিমাল স্ট্রেট-ফরোয়ার্ড ডিজাইন বর্ণনা 2) রিফ্যাক্টর ডিজাইন / আরও ভাল ফ্যাক্টর কোডের কোড
আলেক্সি

1
ব্রিজ ডিজাইনের ধরণটি ব্যাখ্যা করতে গণিতের ধারণাটি ব্যবহার করুন। খুব আকাঙ্ক্ষিত.
জিয়ান হুয়াং

1
এটি কেবল একটি রিফ্যাক্টরিং। ব্রিজ প্যাটার্নের অভিপ্রায়: "এর প্রয়োগ থেকে বিমূর্তিটি দ্বিগুণ করুন যাতে দুটি স্বতন্ত্রভাবে পৃথক হতে পারে।" বিমূর্ততা কোথায় এবং এখানে বাস্তবায়ন কোথায়?
ক্ল্যাপস

জন একটি ব্লগ পোস্টে এটিকে সুন্দরভাবে রাখে । এটি উচ্চ স্তরের ওভিউয়ের জন্য ভাল পঠিত বলে মনে হয়েছে।
বৈভব ভাল্লা

29

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

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

ব্রিজ প্যাটার্নটি এমন কোডের জন্য ব্যবহৃত হয়েছে যা গ্রিনফিল্ড হওয়ার সম্ভাবনা বেশি। আপনি কোনও প্রয়োগের জন্য একটি বিমূর্ত ইন্টারফেস প্রদানের জন্য সেতুটি ডিজাইন করছেন যা পরিবর্তিত হতে পারে তবে আপনি সেইগুলি প্রয়োগকরণ ক্লাসগুলির ইন্টারফেসটিও সংজ্ঞায়িত করেন।

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

কোড-ভিত্তিক, দুটি প্যাটার্নগুলি খুব একই রকম। ব্যবসায়ের ভিত্তিতে তারা আলাদা're

Http://c2.com/cgi/wiki?BridgePattern দেখুন


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

1
@ জেগলসার, হ্যাঁ, আপনি পলিমারফিজম ব্যবহার করেন। ব্রিজ প্যাটার্নটি বিমূর্ততা থেকে বাস্তবায়ন ডিকুয়াল করতে সাবক্লাসগুলির এক ধরণের ব্যবহারের বর্ণনা দেয়।
বিল কারভিন

আপনি বোঝাতে চেয়েছিলেন আসরের দিনটিকে রূপায়ণ (যেমন। আয়তক্ষেত্র) থেকে রঙের বিমূর্ততা ডান? এবং আমি বিশ্বাস করি আপনি বলছেন যে এটি করার বিভিন্ন উপায় রয়েছে এবং সেতু তার মধ্যে একটি just
stdout

হ্যাঁ, সাবক্লাসিংয়ের অন্যান্য ব্যবহার রয়েছে। সাবক্ল্যাস ব্যবহারের এই বিশেষ পদ্ধতিটি এটিকে সেতুর নিদর্শন করে তোলে।
বিল কারভিন

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

27

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

এবং একটি পরামর্শ: সবসময় ধারণাগত দৃষ্টিকোণ থেকে নকশা নিদর্শন চিন্তা করুন, বাস্তবায়ন দৃষ্টিকোণ থেকে নয়। ডান দিক থেকে, ব্রিজ অ্যাডাপ্টারের সাথে বিভ্রান্ত হতে পারে না, কারণ তারা একটি পৃথক সমস্যা সমাধান করে, এবং রচনাটি নিজের স্বার্থের জন্য নয় বরং উত্তরাধিকারের চেয়ে উচ্চতর, কারণ এটি পৃথকভাবে অर्थোগোনাল উদ্বেগগুলি পরিচালনা করতে দেয়।


22

ব্রিজ এবং অ্যাডাপ্টারের অভিপ্রায় পৃথক এবং আমাদের পৃথক পৃথক উভয় ধরণের প্রয়োজন।

ব্রিজ প্যাটার্ন:

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

ব্রিজ প্যাটার্নটি ব্যবহার করুন যখন:

  1. আপনি প্রয়োগের রান-টাইম বাঁধাই করতে চান,
  2. আপনার দ্বিগুণ ইন্টারফেস এবং অসংখ্য বাস্তবায়নের ফলে ক্লাসগুলির একটি বিস্তার রয়েছে,
  3. আপনি একাধিক অবজেক্টের মধ্যে একটি বাস্তবায়ন ভাগ করতে চান,
  4. আপনাকে অर्थোগোনাল শ্রেণীর শ্রেণিবিন্যাসের মানচিত্র তৈরি করতে হবে।

@ জন সোনমেজ উত্তর ক্লাসের ক্রমবর্ধমান হ্রাসে ব্রিজ প্যাটার্নের কার্যকারিতা পরিষ্কারভাবে দেখায়।

কোড উদাহরণ সহ ব্রিজ প্যাটার্নের আরও ভাল অন্তর্দৃষ্টি পেতে আপনি নীচের ডকুমেন্টেশন লিঙ্কটি উল্লেখ করতে পারেন

অ্যাডাপ্টার প্যাটার্ন :

  1. এটি দুটি সম্পর্কিত নয় এমন ইন্টারফেসকে বিভিন্ন বস্তুর মাধ্যমে একসাথে কাজ করার অনুমতি দেয় , সম্ভবত একই ভূমিকা পালন করে।
  2. এটি আসল ইন্টারফেসটি পরিবর্তন করে।

মূল পার্থক্য:

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

ইউএমএল ডায়াগ্রাম এবং কার্য কোডের সাথে সম্পর্কিত এসই প্রশ্ন:

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

দরকারী নিবন্ধ:

ব্রাউজ প্যাটার্ন নিবন্ধ উত্স

উত্স তৈরির অ্যাডাপ্টার প্যাটার্ন নিবন্ধ

জার্নালদেব ব্রিজ প্যাটার্ন নিবন্ধ

সম্পাদনা করুন:

ব্রিজ প্যাটার্ন রিয়েল ওয়ার্ল্ড উদাহরণ (মেটা.স্ট্যাকওভারফ্লো ডটকমের পরামর্শ অনুসারে, ডকুমেন্টেশন সূর্য অস্ত যাওয়ার পরে এই পোস্টে অন্তর্ভুক্ত ডকুমেন্টেশন সাইটের উদাহরণ)

ব্রিজ প্যাটার্ন বাস্তবায়ন থেকে বিমূর্তিকে ডিউপল করে তোলে যাতে উভয়ই পৃথকভাবে পৃথক হতে পারে। এটি উত্তরাধিকারের চেয়ে রচনা দিয়ে অর্জিত হয়েছে।

ব্রিজ প্যাটার্ন ইউএমএল উইকিপিডিয়া থেকে:

উইকিপিডিয়া থেকে ব্রিজ প্যাটার্ন ইউএমএল

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

Abstraction: এটি একটি ইন্টারফেস সংজ্ঞায়িত করে

RefinedAbstraction: এটি বিমূর্তি প্রয়োগ করে:

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

ConcreteImplementor: এটি প্রয়োগকারী ইন্টারফেস প্রয়োগ করে।

The crux of Bridge pattern :রচনা (এবং কোনও উত্তরাধিকার নেই) ব্যবহার করে দুটি অर्थোগোনাল শ্রেণীর শ্রেণিবিন্যাস। বিমূর্ততা শ্রেণিবিন্যাস এবং বাস্তবায়ন শ্রেণিবিন্যাস স্বাধীনভাবে পৃথক হতে পারে। বাস্তবায়ন কখনই অ্যাবস্ট্রাকশনকে বোঝায় না। অ্যাবস্ট্রাকশনটিতে সদস্য হিসাবে প্রয়োগের ইন্টারফেস থাকে (রচনার মাধ্যমে)। এই রচনাটি উত্তরাধিকারের স্তরক্রমের আরও একটি স্তর হ্রাস করে।

আসল শব্দ ব্যবহারের কেস:

ম্যানুয়াল এবং অটো গিয়ার সিস্টেমের উভয় সংস্করণ রাখতে বিভিন্ন যানকে সক্ষম করুন।

উদাহরণ কোড:

/* Implementor interface*/
interface Gear{
    void handleGear();
}

/* Concrete Implementor - 1 */
class ManualGear implements Gear{
    public void handleGear(){
        System.out.println("Manual gear");
    }
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
    public void handleGear(){
        System.out.println("Auto gear");
    }
}
/* Abstraction (abstract class) */
abstract class Vehicle {
    Gear gear;
    public Vehicle(Gear gear){
        this.gear = gear;
    }
    abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
    public Car(Gear gear){
        super(gear);
        // initialize various other Car components to make the car
    }
    public void addGear(){
        System.out.print("Car handles ");
        gear.handleGear();
    }
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
    public Truck(Gear gear){
        super(gear);
        // initialize various other Truck components to make the car
    }
    public void addGear(){
        System.out.print("Truck handles " );
        gear.handleGear();
    }
}
/* Client program */
public class BridgeDemo {    
    public static void main(String args[]){
        Gear gear = new ManualGear();
        Vehicle vehicle = new Car(gear);
        vehicle.addGear();

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

        gear = new ManualGear();
        vehicle = new Truck(gear);
        vehicle.addGear();

        gear = new AutoGear();
        vehicle = new Truck(gear);
        vehicle.addGear();
    }
}

আউটপুট:

Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear

ব্যাখ্যা:

  1. Vehicle একটি বিমূর্ততা।
  2. Carএবং Truckদুটি কংক্রিট বাস্তবায়ন Vehicle
  3. Vehicleএকটি বিমূর্ত পদ্ধতি সংজ্ঞায়িত করে: addGear()
  4. Gear বাস্তবায়নকারী ইন্টারফেস হয়
  5. ManualGearএবং AutoGearদুটি বাস্তবায়ন হয় Gear
  6. Vehicleimplementorইন্টারফেস বাস্তবায়ন চেয়ে ইন্টারফেস রয়েছে । Compositonপ্রয়োগকারী ইন্টারফেসের এই প্যাটার্নটির কর্কট: এটি বিমূর্ততা এবং প্রয়োগকে স্বাধীনভাবে পৃথক হতে দেয়।
  7. Carএবং Truckবিমূর্তনের জন্য বাস্তবায়ন (পুনরায় সংজ্ঞায়িত বিমূর্ততা) সংজ্ঞায়িত করুন addGear(): এতে রয়েছে Gear- হয় Manualবা হয়Auto

ব্রিজ প্যাটার্নের জন্য কেস (গুলি) ব্যবহার করুন :

  1. বিমূর্তি এবং বাস্তবায়ন একে অপরকে স্বতন্ত্র পরিবর্তন করতে পারে এবং তারা সংকলনের সময়ে আবদ্ধ হয় না
  2. মানচিত্র লম্ব শ্রেণীবিন্যাসের - জন্য এক বিমূর্ততা এবং জন্য এক বাস্তবায়ন

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

যদিও ম্যানুয়াল এবং অটো গিয়ারের জন্য ট্রাক এবং গাড়ি
অ্যান্ডিগরের

9

আমি কাজে ব্রিজ প্যাটার্নটি ব্যবহার করেছি। আমি সি ++ তে প্রোগ্রাম করি, যেখানে এটি প্রায়শই পিআইএমপিএল আইডিয়ম (বাস্তবায়নের পয়েন্টার) বলে। দেখে মনে হচ্ছে:

class A
{
public: 
  void foo()
  {
    pImpl->foo();
  }
private:
  Aimpl *pImpl;
};

class Aimpl
{
public:
  void foo();
  void bar();
};  

এই উদাহরণে class Aইন্টারফেস class Aimplরয়েছে এবং বাস্তবায়ন রয়েছে।

এই নিদর্শনটির জন্য একটি ব্যবহার হ'ল বাস্তবায়নকারী শ্রেণীর কিছু জনসাধারণকেই প্রকাশ করা, তবে অন্যদের নয়। উদাহরণে কেবল Aimpl::foo()সর্বজনীন ইন্টারফেসের মাধ্যমে ডাকা যেতে পারে A, তবে তা নয়Aimpl::bar()

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


2
আপনি যদি এই প্যাটার্নটি ব্যবহার করেন তবে এআইএমপিএল এমনকি শিরোনামের প্রয়োজন হয় না। আমি এটিকে কেবলমাত্র এ শ্রেণির জন্য বাস্তবায়নের ফাইলে ইনলাইন রেখেছি
1800 তথ্য

আপনার প্রয়োগকারী ব্যক্তিগত। এই বিষয়ে আমার একটি নতুন প্রশ্ন আছে, দেখুন stackoverflow.com
রোল্যান্ড

7

কোডে আকৃতির উদাহরণ স্থাপন করতে:

#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

class IColor
{
public:
    virtual string Color() = 0;
};

class RedColor: public IColor
{
public:
    string Color()
    {
        return "of Red Color";
    }
};

class BlueColor: public IColor
{
public:
    string Color()
    {
        return "of Blue Color";
    }
};


class IShape
{
public:
virtual string Draw() = 0;
};

class Circle: public IShape
{
        IColor* impl;
    public:
        Circle(IColor *obj):impl(obj){}
        string Draw()
        {
            return "Drawn a Circle "+ impl->Color();
        }
};

class Square: public IShape
{
        IColor* impl;
    public:
        Square(IColor *obj):impl(obj){}
        string Draw()
        {
        return "Drawn a Square "+ impl->Color();;
        }
};

int main()
{
IColor* red = new RedColor();
IColor* blue = new BlueColor();

IShape* sq = new Square(red);
IShape* cr = new Circle(blue);

cout<<"\n"<<sq->Draw();
cout<<"\n"<<cr->Draw();

delete red;
delete blue;
return 1;
}

আউটপুটটি হ'ল:

Drawn a Square of Red Color
Drawn a Circle of Blue Color

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


0

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


0

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

আপনি এই ক্লাসগুলির সাথে আপনার নকশা শুরু করুন:

public class Task {...}
public class AccountingTask : Task {...}
public class ContractTask : Task {...}
public class ClaimTask : Task {...}

এখন, যেহেতু প্রতিটি উত্স অবশ্যই একটি নির্দিষ্ট উপায়ে পরিচালনা করা উচিত, তাই আপনি প্রতিটি কার্য প্রকারের বিশেষজ্ঞ করার সিদ্ধান্ত নিয়েছেন:

public class EmailAccountingTask : AccountingTask {...}
public class FaxAccountingTask : AccountingTask {...}
public class EmessagingAccountingTask : AccountingTask {...}

public class EmailContractTask : ContractTask {...}
public class FaxContractTask : ContractTask {...}
public class EmessagingContractTask : ContractTask {...}

public class EmailClaimTask : ClaimTask {...}
public class FaxClaimTask : ClaimTask {...}
public class EmessagingClaimTask : ClaimTask {...}

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

// Source
public class Source {
   public string GetSender();
   public string GetMessage();
   public string GetContractReference();
   (...)
}

public class EmailSource : Source {...}
public class FaxSource : Source {...}
public class EmessagingSource : Source {...}

// Task
public class Task {
   public Task(Source source);
   (...)
}
public class AccountingTask : Task {...}
public class ContractTask : Task {...}
public class ClaimTask : Task {...}

কোনও টাস্ক টাইপ বা উত্স যুক্ত করা এখন আরও সহজ।

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


-4
Bridge design pattern we can easily understand helping of service and dao layer.

Dao layer -> create common interface for dao layer ->
public interface Dao<T>{
void save(T t);
}
public class AccountDao<Account> implement Dao<Account>{
public void save(Account){
}
}
public LoginDao<Login> implement Dao<Login>{
public void save(Login){
}
}
Service Layer ->
1) interface
public interface BasicService<T>{
    void save(T t);
}
concrete  implementation of service -
Account service -
public class AccountService<Account> implement BasicService<Account>{
 private Dao<Account> accountDao;
 public AccountService(AccountDao dao){
   this.accountDao=dao;
   }
public void save(Account){
   accountDao.save(Account);
 }
}
login service- 
public class LoginService<Login> implement BasicService<Login>{
 private Dao<Login> loginDao;
 public AccountService(LoginDao dao){
   this.loginDao=dao;
   }
public void save(Login){
   loginDao.save(login);
 }
}

public class BridgePattenDemo{
public static void main(String[] str){
BasicService<Account> aService=new AccountService(new AccountDao<Account>());
Account ac=new Account();
aService.save(ac);
}
}
}

5
আমি হ্রাস পেয়েছি কারণ আমি অনুভব করি যে এটি একটি সংশ্লেষিত, দুর্বল বিন্যাসযুক্ত উত্তর।
জিমানো 12

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