সেতু প্যাটার্ন কি?
সেতু প্যাটার্ন একটি কাঠামোগত নকশা প্যাটার্ন. অন্য কথায়, এর প্রধান কাজ ক্লাস এবং অবজেক্টের বাইরে একটি পূর্ণাঙ্গ কাঠামো তৈরি করা। একটি সেতু এক বা একাধিক শ্রেণীকে পৃথক শ্রেণীবিভাগে বিভক্ত করে এটি করে: বিমূর্তকরণ এবং বাস্তবায়ন । একটি অনুক্রমের কার্যকারিতার পরিবর্তন অন্যটিতে পরিবর্তন আনতে বাধ্য নয়। এটি সব সূক্ষ্ম এবং ভাল, কিন্তু এই সংজ্ঞাটি খুব বিস্তৃত এবং সবচেয়ে গুরুত্বপূর্ণ প্রশ্নের উত্তর দেয় না: "সেতু প্যাটার্ন কি?" আমি মনে করি আপনার জন্য এর ব্যবহারিক প্রয়োগ বুঝতে সহজ হবে। তাই সরাসরি, ব্রিজ প্যাটার্নের জন্য একটি ক্লাসিক দৃশ্য তৈরি করা যাক। আমাদের একটি বিমূর্তShape
শ্রেণী রয়েছে, যা একটি জেনেরিক জ্যামিতিক চিত্র উপস্থাপন করে:
-
আকৃতি.জাভা
public abstract class Shape { public abstract void draw(); }
যখন আমরা ত্রিভুজ এবং আয়তক্ষেত্রের মতো আকারগুলি যোগ করার সিদ্ধান্ত নিয়েছি, তখন আমরা তাদের ক্লাসের উত্তরাধিকারী করব
Shape
: -
Rectangle.java:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
Triangle.java:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
এই রঙের উপর নির্ভর করবে। পদ্ধতির বিভিন্ন বাস্তবায়নের জন্য draw()
, তারপর আমাদের প্রতিটি আকৃতি-রঙের সমন্বয়ের জন্য একটি শ্রেণী তৈরি করতে হবে। যদি আমাদের তিনটি রঙ থাকে, তাহলে আমাদের ছয়টি শ্রেণির প্রয়োজন: TriangleBlack
, TriangleGreen
, TriangleRed
, RectangleBlack
, RectangleGreen
এবং RectangleRed
. ছয়টি ক্লাস এত বড় সমস্যা নয়। কিন্তু! যদি আমাদের একটি নতুন আকৃতি বা রঙ যোগ করতে হয়, তাহলে ক্লাসের সংখ্যা দ্রুতগতিতে বৃদ্ধি পায়। এই অবস্থা থেকে কিভাবে বের হওয়া যায়? একটি ক্ষেত্রে রঙ সংরক্ষণ করা এবং শর্তসাপেক্ষ বিবৃতি ব্যবহার করে সমস্ত বিকল্প গণনা করা সেরা সমাধান নয়। একটি ভাল সমাধান হল একটি পৃথক ইন্টারফেসে রঙ সরানো. যত তাড়াতাড়ি বলা হয়ে গেছে: আসুন Color
তিনটি বাস্তবায়নের সাথে একটি ইন্টারফেস তৈরি করি: BlackColor
, GreenColor
এবং RedColor
:
-
Color.java:
public interface Color { void fillColor(); }
-
BlackColor.java:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
GreenColor.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
RedColor.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
এখন আমরা ক্লাসে একটি
Color
ক্ষেত্র যোগ করিShape
। আমরা কনস্ট্রাক্টরে এর মান পাব। -
Shape.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
আমরা বাস্তবায়নে ভেরিয়েবল ব্যবহার করবShape
। এর মানে হল যে আকারগুলি এখন ইন্টারফেসের কার্যকারিতা ব্যবহার করতে পারেColor
। -
আয়তক্ষেত্র.জাভা
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
একটি সেতু যা দুটি পৃথক শ্রেণির শ্রেণিবিন্যাসকে সংযুক্ত করে।
কীভাবে একটি সেতু তৈরি করবেন: বিমূর্ততা এবং বাস্তবায়ন
আসুন একটি ক্লাস ডায়াগ্রাম দেখি যা সেতুর প্যাটার্নটি চিত্রিত করে: এখানে আপনি দুটি স্বাধীন কাঠামো দেখতে পাবেন যা একে অপরের কার্যকারিতা প্রভাবিত না করেই পরিবর্তন করা যেতে পারে। আমাদের ক্ষেত্রে:- বিমূর্ততা হল
Shape
ক্লাস - RefinedAbstraction হল
Triangle
এবংRectangle
ক্লাস - ইমপ্লিমেন্টর হল
Color
ইন্টারফেস - ConcreteImplementor হল
BlackColor
,GreenColor
এবংRedColor
ক্লাস।
Shape
হল একটি বিমূর্ততা — বিভিন্ন রং দিয়ে আকৃতির ভরাট পরিচালনা করার জন্য একটি প্রক্রিয়া, যা ইন্টারফেসে Color
(ইমপ্লিমেন্টর) প্রতিনিধিত্ব করে। এবং ক্লাসগুলি হল কংক্রিট Triangle
ক্লাস Rectangle
যা ক্লাস দ্বারা উপলব্ধ প্রক্রিয়া ব্যবহার করে Shape
। BlackColor
, GreenColor
এবং RedColor
বাস্তবায়ন শ্রেণীবিন্যাস মধ্যে কংক্রিট বাস্তবায়ন হয়.
যেখানে ব্রিজ প্যাটার্ন ব্যবহার করবেন
এই প্যাটার্নটি ব্যবহার করার একটি বিশাল সুবিধা হল যে আপনি অন্যটির যুক্তি না ভেঙে একটি অনুক্রমের কার্যকরী ক্লাসে পরিবর্তন করতে পারেন। এছাড়াও, এই পদ্ধতিটি ক্লাসের মধ্যে কাপলিং কমাতে সাহায্য করে। এই প্যাটার্নটি ব্যবহার করার সময় প্রধান প্রয়োজনীয়তা হল "নির্দেশগুলি অনুসরণ করুন" - তাদের কাউকে উপেক্ষা করবেন না! সেই লক্ষ্যে, আসুন পরিস্থিতিগুলি বের করি যখন আপনার অবশ্যই ব্রিজ প্যাটার্নটি ব্যবহার করা উচিত:-
আপনি যদি দুটি ধারণার (যেমন আকার এবং রঙ) সমন্বয়ের উপর ভিত্তি করে সত্তার সংখ্যা প্রসারিত করতে চান।
-
আপনি যদি এমন একটি বড় শ্রেণীকে ভাগ করতে চান যা একক-দায়িত্বের নীতি পূরণ করে না এমন ছোট শ্রেণীতে যেগুলির কার্যকারিতা রয়েছে।
-
প্রোগ্রামটি চলাকালীন নির্দিষ্ট সত্তার যুক্তিতে পরিবর্তন করার প্রয়োজন হলে।
-
যদি ক্লাস বা লাইব্রেরির ক্লায়েন্টদের কাছ থেকে একটি বাস্তবায়ন লুকানোর প্রয়োজন হয়।
প্যাটার্নের সুবিধা এবং অসুবিধা
অন্যান্য নিদর্শনগুলির মতো, একটি সেতুর সুবিধা এবং অসুবিধা উভয়ই রয়েছে। সেতু প্যাটার্নের সুবিধা:- এটি কোডের মাপযোগ্যতা উন্নত করে — আপনি প্রোগ্রামের অন্য অংশে কিছু ভাঙার ভয় ছাড়াই কার্যকারিতা যোগ করতে পারেন।
- এটি উপশ্রেণির সংখ্যা হ্রাস করে যখন সত্তার সংখ্যা অন্যথায় দুটি ধারণার সংমিশ্রণের উপর ভিত্তি করে (উদাহরণস্বরূপ, আকার এবং রঙ)।
- এটি পৃথকভাবে দুটি পৃথক শ্রেণিবিন্যাসের উপর কাজ করা সম্ভব করে - বিমূর্তকরণ এবং বাস্তবায়ন। দুটি ভিন্ন বিকাশকারী একে অপরের কোডের বিশদ বিবরণ না জেনে পরিবর্তন করতে পারে।
- এটি ক্লাসের মধ্যে সংযোগ কমিয়ে দেয় — একমাত্র জায়গা যেখানে দুটি শ্রেণী একত্রিত হয় সেটি হল সেতু (অর্থাৎ ক্ষেত্র
Color color
)।
- নির্দিষ্ট পরিস্থিতি এবং একটি প্রকল্পের সামগ্রিক কাঠামোর উপর নির্ভর করে, এটি একটি প্রোগ্রামের কর্মক্ষমতাকে নেতিবাচকভাবে প্রভাবিত করতে পারে (উদাহরণস্বরূপ, যদি আপনাকে আরও অবজেক্ট শুরু করতে হয়)।
- দুটি শ্রেণীর মধ্যে স্যুইচ করার প্রয়োজনের কারণে এটি কোডকে কম পাঠযোগ্য করে তোলে।
GO TO FULL VERSION