پل پیٹرن کیا ہے؟
پل پیٹرن ایک ساختی ڈیزائن پیٹرن ہے. دوسرے لفظوں میں، اس کا بنیادی کام طبقات اور اشیاء سے ایک مکمل ڈھانچہ بنانا ہے۔ ایک پل یہ ایک یا زیادہ کلاسوں کو الگ الگ درجہ بندی میں تقسیم کرکے کرتا ہے: تجرید اور نفاذ ۔ ایک درجہ بندی میں فعالیت میں تبدیلی دوسرے میں تبدیلی کی ضرورت نہیں ہے۔ یہ سب ٹھیک اور اچھا ہے، لیکن یہ تعریف بہت وسیع ہے اور اس سب سے اہم سوال کا جواب نہیں دیتی: "پل پیٹرن کیا ہے؟" میرے خیال میں آپ کے لیے اس کے عملی اطلاق کو سمجھنا آسان ہوگا۔ تو فوراً، آئیے پل پیٹرن کے لیے ایک کلاسک منظر نامہ بناتے ہیں۔ ہمارے پاس ایک تجریدی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
،،،، اور . چھ کلاسیں اتنا بڑا مسئلہ نہیں ہے۔ لیکن! اگر ہمیں ایک نئی شکل یا رنگ شامل کرنے کی ضرورت ہے، تو کلاسوں کی تعداد تیزی سے بڑھتی ہے۔ اس صورتحال سے کیسے نکلا جائے؟ کسی فیلڈ میں رنگ کو ذخیرہ کرنا اور مشروط بیانات کا استعمال کرتے ہوئے تمام اختیارات کو شمار کرنا بہترین حل نہیں ہے۔ ایک اچھا حل یہ ہے کہ رنگ کو الگ انٹرفیس میں منتقل کیا جائے ۔ مکمل ہونے سے جلد ہی کہا: آئیے تین نفاذ کے ساتھ ایک انٹرفیس بنائیں: , and : 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"); } }
-
ریڈ کلر۔جاوا
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