আমি "ব্রিজ" ডিজাইন প্যাটার্নটি মোটেই বুঝতে পারি না। আমি বিভিন্ন ওয়েব সাইট দিয়েছি, কিন্তু তারা সাহায্য করেনি।
এটি বুঝতে কেউ আমাকে সহায়তা করতে পারে?
আমি "ব্রিজ" ডিজাইন প্যাটার্নটি মোটেই বুঝতে পারি না। আমি বিভিন্ন ওয়েব সাইট দিয়েছি, কিন্তু তারা সাহায্য করেনি।
এটি বুঝতে কেউ আমাকে সহায়তা করতে পারে?
উত্তর:
ওওপিতে আমরা বহুকর্ম ব্যবহার করি যাতে বিমূর্তিতে একাধিক বাস্তবায়ন হতে পারে। আসুন নীচের উদাহরণটি দেখুন:
//trains abstraction
public interface Train
{
move();
}
public class MonoRail:Train
{
public override move()
{
//use one track;
}
}
public class Rail:Train
{
public override move()
{
//use two tracks;
}
}
একটি নতুন প্রয়োজনীয়তা প্রবর্তিত হয়েছে এবং ট্রেনগুলির ত্বরণের দৃষ্টিকোণটি আনতে হবে, সুতরাং নীচের মতো কোডটি পরিবর্তন করুন।
public interface Train
{
void move();
}
public class MonoRail:Train
{
public override void move()
{
//use one track;
}
}
public class ElectricMonoRail:MonoRail
{
public override void move()
{
//use electric engine on one track.
}
}
public class DieselMonoRail: MonoRail
{
public override void move()
{
//use diesel engine on one track.
}
}
public class Rail:Train
{
public override void move()
{
//use two tracks;
}
}
public class ElectricRail:Rail
{
public override void move()
{
//use electric engine on two tracks.
}
}
public class DieselRail: Rail
{
public override void move()
{
//use diesel engine on two tracks.
}
}
উপরের কোডটি সংরক্ষণযোগ্য নয় এবং পুনরায় ব্যবহারযোগ্যতার অভাব রয়েছে (ধরে নিই আমরা একই ট্র্যাক প্ল্যাটফর্মের জন্য ত্বরণ প্রক্রিয়াটি পুনরায় ব্যবহার করতে পারি)। নিম্নলিখিত কোডটি সেতুর প্যাটার্ন প্রয়োগ করে এবং দুটি পৃথক বিমূর্ততা, ট্রেন পরিবহন এবং ত্বরণকে পৃথক করে ।
public interface Train
{
void move(Accelerable engine);
}
public interface Accelerable
{
public void accelerate();
}
public class MonoRail:Train
{
public override void move(Accelerable engine)
{
//use one track;
engine.accelerate(); //engine is pluggable (runtime dynamic)
}
}
public class Rail:Train
{
public override void move(Accelerable engine)
{
//use two tracks;
engine.accelerate(); //engine is pluggable (runtime dynamic)
}
}
public class ElectricEngine:Accelerable{/*implementation code for accelerable*/}
public class DieselEngine:Accelerable{/*implementation code for accelerable*/}
Monorail
কারণ এটি দুটি শব্দ নয়, এটি একটি একক (যৌগিক) শব্দ। একটি মনোরেল হ'ল রেলের কিছু ধরণের সাবক্লাসের পরিবর্তে বিভিন্ন ধরণের রেলের (যা এটি)। ঠিক যেমন আমরা ব্যবহার করব না SunShine
বা CupCake
, সেগুলি হবে Sunshine
এবংCupcake
বেশিরভাগ ডিজাইনের নিদর্শনগুলিতে সহায়ক নাম থাকলেও আমি "ব্রিজ" নামটি এটি কী করে তা বিবেচনায় অ-স্বজ্ঞাত বলে মনে করি।
ধারণামূলকভাবে, আপনি শ্রেণি শ্রেণিবিন্যাসের দ্বারা ব্যবহৃত বাস্তবায়নের বিবরণটিকে অন্য কোনও বস্তুর মধ্যে ধাক্কা দেন, সাধারণত তার নিজস্ব শ্রেণিবিন্যাস সহ। এটি করার মাধ্যমে আপনি সেইগুলি প্রয়োগের বিশদগুলির উপর একটি দৃ tight় নির্ভরতা সরিয়ে দিচ্ছেন এবং সেই প্রয়োগের বিশদটি পরিবর্তনের অনুমতি দিচ্ছেন।
আপনি যদি একটি নতুন আচরণে প্লাগ করতে পারেন তেমন একটি ছোট স্কেলে, আমি এটিকে কৌশল প্যাটার্নের ব্যবহারের সাথে তুলনা করি। তবে প্রায়শই একটি কৌশল হিসাবে দেখা যায় কেবল একটি অ্যালগরিদম মোড়ানোর পরিবর্তে বাস্তবায়ন বস্তুটি সাধারণত আরও বৈশিষ্ট্য পূর্ণ হয়। এবং আপনি যখন ধারণাটি পুরো শ্রেণির শ্রেণিবিন্যাসে প্রয়োগ করেন তখন বৃহত্তর প্যাটার্নটি একটি সেতুতে পরিণত হয়। (আবার নামটি ঘৃণা করুন)।
আপনি যে প্রতিদিন ব্যবহার করবেন এটি এমন কোনও প্যাটার্ন নয়, তবে ক্লাসগুলির সম্ভাব্য বিস্ফোরণ পরিচালনা করার সময় আমি এটি সহায়ক বলে মনে করেছি যখন আপনার একাধিক উত্তরাধিকারের প্রয়োজন (স্পষ্ট) প্রয়োজন।
এখানে একটি বাস্তব বিশ্বের উদাহরণ:
আমার কাছে একটি র্যাড সরঞ্জাম রয়েছে যা আপনাকে কোনও ডিজাইনের পৃষ্ঠের উপর নিয়ন্ত্রণগুলি ড্রপ এবং কনফিগার করতে দেয়, সুতরাং আমার কাছে এই জাতীয় একটি মডেল রয়েছে:
Widget // base class with design surface plumbing
+ Top
+ Left
+ Width
+ Height
+ Name
+ SendToBack
+ BringToFront
+ OnPropertyEdit
+ OnSelect
+ Validate
+ ShowEditor
+ Paint
+ Etc
TextboxWidget : Widget // text box specific
+ Text
+ MaxLength
+ Font
+ ShowEditor // override base to show a property editor form specific to a Textbox
+ Paint // override to render a textbox onto the surface
+ Etc
ListWidget : Widget // list specific
+ Items
+ SelectedItem
+ ShowEditor // override base to show a property editor form specific to a List
+ Paint // override to render a list onto the surface
+ Etc
এবং এভাবেই সম্ভবত এক ডজন নিয়ন্ত্রণ রয়েছে।
তবে একাধিক থিমকে সমর্থন করার জন্য একটি নতুন প্রয়োজনীয়তা যুক্ত করা হয়েছে (চেহারা-এন-অনুভূতি)। ধরুন আমরা নিম্নলিখিত থিম আছে যাক: Win32
, WinCE
, WinPPC
, WinMo50
, WinMo65
। প্রতিটি থিমের ডিফল্টফন্ট, ডিফল্টব্যাক কালার, বর্ডারউইথ, ড্র ফ্রেম, ড্রসক্রোলথম্ব ইত্যাদি রেন্ডারিং-সম্পর্কিত ক্রিয়াকলাপগুলির জন্য আলাদা মান বা বাস্তবায়ন থাকবে
আমি এই জাতীয় একটি বস্তু মডেল তৈরি করতে পারে:
Win32TextboxWidget : TextboxWidget
Win32ListWidget : ListWidget
ইত্যাদি, একটি নিয়ন্ত্রণ ধরণের জন্য
WinCETextboxWidget : TextboxWidget
WinCEListWidget : ListWidget
ইত্যাদি, একে অপরের নিয়ন্ত্রণের জন্য (আবার)
আপনি ধারণা পাবেন — আপনি থিমের # উইজেটের বারের একটি শ্রেণির বিস্ফোরণ পেতে পারেন। এটি প্রতিটি থিম সম্পর্কে সচেতন করে আরএডি ডিজাইনারকে জটিল করে তোলে। এছাড়াও, নতুন থিম যুক্ত করা RAD ডিজাইনারকে সংশোধন করতে বাধ্য করে। তদ্ব্যতীত, একটি থিমের মধ্যে প্রচুর প্রচলিত বাস্তবায়ন রয়েছে যা উত্তরাধিকার সূত্রে দুর্দান্ত হবে তবে নিয়ন্ত্রণগুলি ইতিমধ্যে একটি সাধারণ বেস ( Widget
) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ।
সুতরাং পরিবর্তে আমি যা করেছি তা হল একটি পৃথক অবজেক্ট শ্রেণিবদ্ধতা যা থিমটি প্রয়োগ করে। প্রতিটি উইজেট অবজেক্টের একটি রেফারেন্স ধারণ করে যা রেন্ডারিং অপারেশনগুলি প্রয়োগ করে। অনেক পাঠ্যক্রমে, এই শ্রেণিটি একটি সহ্য করা হয়েছে Impl
তবে আমি সেই নামকরণ সম্মেলন থেকে বিচ্যুত হয়েছি।
সুতরাং এখন আমার TextboxWidget
চেহারা এই মত:
TextboxWidget : Widget // text box specific
+ Text
+ MaxLength
+ Font
+ ShowEditor
+ Painter // reference to the implementation of the widget rendering operations
+ Etc
এবং আমি আমার বিভিন্ন চিত্রকরকে আমার থিম-নির্দিষ্ট বেসের উত্তরাধিকারী করতে পারি, যা আমি আগে করতে পারিনি:
Win32WidgetPainter
+ DefaultFont
+ DefaultFontSize
+ DefaultColors
+ DrawFrame
+ Etc
Win32TextboxPainter : Win32WidgetPainter
Win32ListPainter : Win32WidgetPainter
একটি দুর্দান্ত জিনিস হ'ল আমি রান-টাইমে বাস্তবায়নগুলি গতিশীলভাবে লোড করতে পারি, মূল সফ্টওয়্যারটি পরিবর্তন না করে আমাকে যতগুলি থিম যোগ করতে দেয় তার অনুমতি দেয়। অন্য কথায় আমার "প্রয়োগটি বিমূর্ততার থেকে পৃথক হতে পারে"।
Win32TextboxPainter
এবং Win32ListPainter
থেকে Win32WidgetPainter
। আপনি করতে পারেন বাস্তবায়ন পাশ একটি উত্তরাধিকার গাছ আছে, কিন্তু এটি আরো জেনেরিক (সম্ভবত হওয়া উচিত StaticStyleControlPainter
, EditStyleControlPainter
এবং ButtonStyleControlPainter
হিসাবে প্রয়োজন ওভাররাইড কোন প্রয়োজন আদিম অপারেশন সহ)। এটি আমি যে উদাহরণটিতে ভিত্তি করেছিলাম তার বাস্তব কোডের কাছাকাছি।
ব্রিজটি তার কংক্রিট বাস্তবায়ন থেকে বিমূর্ততা ডিকুয়াল করতে চায় , যাতে উভয়ই স্বতন্ত্রভাবে পরিবর্তিত হতে পারে:
সেতুটি রচনাটি ব্যবহার করে এটি অর্জন করে:
প্রায়শই বিভ্রান্তির বিষয়ে অতিরিক্ত মন্তব্য
এই প্যাটার্নটি অ্যাডাপ্টারের প্যাটার্নের সাথে খুব মিল: বিমূর্ততা একটি বাস্তবায়নের জন্য আলাদা ইন্টারফেস দেয় এবং এটি করার জন্য রচনা ব্যবহার করে। কিন্তু:
1995 এর নকশাগুলির মধ্যে প্রধান পার্থক্য তাদের উদ্দেশ্যগুলির মধ্যে রয়েছে
- 1995 সালে " ডিজাইনের নিদর্শন, পুনরায় ব্যবহারযোগ্য ওও সফ্টওয়্যারটির উপাদান " , 1995
নকশার নিদর্শনগুলির বিষয়ে এই দুর্দান্ত সেমিনাল বইটিতে লেখকরা এটিও পর্যবেক্ষণ করেছেন: