الگوی پل چیست؟
الگوی پل یک الگوی طراحی سازه است. یعنی وظیفه اصلی آن ایجاد یک ساختار کامل از کلاس ها و اشیاء است. Bridge این مشکل را با جدا کردن یک یا چند کلاس به سلسله مراتب جداگانه حل می کند - انتزاع و پیاده سازی . تغییر در عملکرد در یک سلسله مراتب مستلزم تغییر در دیگری نیست. همه چیز واضح به نظر می رسد، اما در واقع این تعریف بسیار گسترده به نظر می رسد و به سوال اصلی پاسخ نمی دهد: "الگوی پل چیست؟" من فکر می کنم که این در عمل برای شما راحت تر خواهد بود. بیایید بلافاصله یک مثال کلاسیک برای الگوی Bridge مدل کنیم. ما یک کلاس انتزاعی داریمShape
که به طور کلی یک شکل هندسی را توصیف می کند:
-
Shape.java
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
. -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
است که دو سلسله مراتب کلاسی مجزا را به هم متصل می کند.
دستگاه پل: انتزاع و اجرا چیست
بیایید به نمودار کلاسی که الگوی Bridge را توصیف میکند نگاهی بیندازیم: در اینجا میتوانید دو ساختار مستقل را مشاهده کنید که میتوانند بدون تأثیر بر عملکرد یکدیگر اصلاح شوند. در مورد ما این است:- انتزاع - کلاس
Shape
; - RefinedAbstraction - classes
Triangle
,Rectangle
; - پیاده کننده - رابط
Color
; - ConcreteImplementor - کلاسها
BlackColor
وGreenColor
.RedColor
Shape
یک Abstraction را نشان میدهد - مکانیزمی برای کنترل رنگآمیزی اشکال در رنگهای مختلف، که پیادهسازی را به اینترفیس واگذار میکند Color
. کلاس ها اشیاء واقعی Triangle
هستند Rectangle
که از مکانیزم ارائه شده توسط کلاس استفاده می کنند Shape
. BlackColor
، GreenColor
و RedColor
- پیاده سازی های خاص در شاخه پیاده سازی. آنها اغلب پلت فرم نامیده می شوند.
الگوی Bridge کجا استفاده می شود؟
مزیت بزرگ استفاده از این الگو این است که میتوانید در عملکرد کلاسها در یک شاخه تغییراتی ایجاد کنید، بدون اینکه منطق شاخه دیگر را زیر پا بگذارید. این رویکرد همچنین به کاهش جفت شدن کلاس های برنامه کمک می کند. شرط اصلی استفاده از الگوها این است که "دستورالعمل ها را دنبال کنید": آنها را به جایی نچسبانید! در واقع، بیایید بفهمیم که در چه مواردی قطعاً باید از Bridge استفاده کنید:-
اگر لازم است تعداد موجودات را در دو جهت (اشکال هندسی، رنگ) گسترش دهید.
-
اگر میخواهید یک کلاس بزرگ را که با اصل مسئولیت تکی مطابقت ندارد، به کلاسهای کوچکتر با عملکرد با مشخصات محدود تقسیم کنید.
-
اگر نیاز احتمالی به ایجاد تغییرات در منطق عملکرد موجودیت های خاص در حین اجرای برنامه وجود داشته باشد.
-
در صورت لزوم، پیاده سازی را از مشتریان کلاس (کتابخانه) مخفی کنید.
مزایا و معایب الگو
مانند دیگر الگوها، پل هم مزایا و هم معایب دارد. مزایای پل:- مقیاس پذیری کد را بهبود می بخشد - می توانید بدون ترس از شکستن چیزی در قسمت دیگری از برنامه عملکردی را اضافه کنید.
- تعداد زیر کلاس ها را کاهش می دهد - زمانی کار می کند که لازم است تعداد موجودیت ها در دو جهت گسترش یابد (به عنوان مثال، تعداد اشکال و تعداد رنگ ها).
- کار جداگانه روی دو شاخه مستقل Abstraction و Implementation را امکان پذیر می کند - این کار را می توان توسط دو توسعه دهنده مختلف بدون پرداختن به جزئیات کد یکدیگر انجام داد.
- کاهش جفت شدن کلاس ها - تنها جایی که دو کلاس به هم متصل هستند، پل (فیلد
Color color
) است.
- بسته به موقعیت خاص و ساختار پروژه به عنوان یک کل، ممکن است تأثیر منفی بر بهره وری برنامه داشته باشد (به عنوان مثال، اگر اشیاء بیشتری نیاز به مقداردهی اولیه داشته باشند).
- خوانایی کد را به دلیل نیاز به پیمایش بین کلاس ها پیچیده می کند.
GO TO FULL VERSION