JavaRush /وبلاگ جاوا /Random-FA /الگوی طراحی پل

الگوی طراحی پل

در گروه منتشر شد
سلام! ما همچنان به درک یک موضوع گسترده و بسیار مفید - الگوهای طراحی ادامه می دهیم. امروز در مورد بریج صحبت خواهیم کرد. مانند سایر الگوها، Bridge برای حل مشکلات رایجی که یک توسعه دهنده هنگام طراحی معماری نرم افزار با آن مواجه می شود، خدمت می کند. بیایید امروز ویژگی های آن را مطالعه کنیم و نحوه استفاده از آن را دریابیم.

الگوی پل چیست؟

الگوی پل یک الگوی طراحی سازه است. یعنی وظیفه اصلی آن ایجاد یک ساختار کامل از کلاس ها و اشیاء است. 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و . شش کلاس آنقدرها هم مهم نیست. ولی! اگر نیاز به اضافه کردن یک شکل یا رنگ جدید داشته باشیم، تعداد کلاس ها به صورت تصاعدی افزایش می یابد. چگونه از این وضعیت خارج شویم؟ ذخیره رنگ ها در یک زمینه و امتحان گزینه ها از طریق شرطی ها بهترین راه حل نیست. یک راه حل خوب، نمایش رنگ در یک رابط جداگانه است . زودتر گفته شد: بیایید یک رابط و سه مورد از پیاده سازی آن ایجاد کنیم - و : RectangleGreenRectangleRedColorBlackColorGreenColorRedColor
  • 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 را توصیف می‌کند نگاهی بیندازیم: مقدمه ای بر الگوی طراحی پل - 2در اینجا می‌توانید دو ساختار مستقل را مشاهده کنید که می‌توانند بدون تأثیر بر عملکرد یکدیگر اصلاح شوند. در مورد ما این است:
  • انتزاع - کلاس Shape;
  • RefinedAbstraction - classes Triangle, Rectangle;
  • پیاده کننده - رابط Color;
  • ConcreteImplementor - کلاسها BlackColorو GreenColor.RedColor
کلاس Shapeیک Abstraction را نشان می‌دهد - مکانیزمی برای کنترل رنگ‌آمیزی اشکال در رنگ‌های مختلف، که پیاده‌سازی را به اینترفیس واگذار می‌کند Color. کلاس ها اشیاء واقعی Triangleهستند Rectangleکه از مکانیزم ارائه شده توسط کلاس استفاده می کنند Shape. BlackColor، GreenColorو RedColor- پیاده سازی های خاص در شاخه پیاده سازی. آنها اغلب پلت فرم نامیده می شوند.

الگوی Bridge کجا استفاده می شود؟

مزیت بزرگ استفاده از این الگو این است که می‌توانید در عملکرد کلاس‌ها در یک شاخه تغییراتی ایجاد کنید، بدون اینکه منطق شاخه دیگر را زیر پا بگذارید. این رویکرد همچنین به کاهش جفت شدن کلاس های برنامه کمک می کند. شرط اصلی استفاده از الگوها این است که "دستورالعمل ها را دنبال کنید": آنها را به جایی نچسبانید! در واقع، بیایید بفهمیم که در چه مواردی قطعاً باید از Bridge استفاده کنید:
  1. اگر لازم است تعداد موجودات را در دو جهت (اشکال هندسی، رنگ) گسترش دهید.

  2. اگر می‌خواهید یک کلاس بزرگ را که با اصل مسئولیت تکی مطابقت ندارد، به کلاس‌های کوچک‌تر با عملکرد با مشخصات محدود تقسیم کنید.

  3. اگر نیاز احتمالی به ایجاد تغییرات در منطق عملکرد موجودیت های خاص در حین اجرای برنامه وجود داشته باشد.

  4. در صورت لزوم، پیاده سازی را از مشتریان کلاس (کتابخانه) مخفی کنید.

هنگامی که هر بار از یک الگو استفاده می کنید، باید به یاد داشته باشید که موجودیت های اضافی را به کد اضافه می کند - استفاده از آن در پروژه ای که فقط یک شکل هندسی و یک یا دو رنگ ممکن وجود دارد کاملاً منطقی نیست.

مزایا و معایب الگو

مانند دیگر الگوها، پل هم مزایا و هم معایب دارد. مزایای پل:
  1. مقیاس پذیری کد را بهبود می بخشد - می توانید بدون ترس از شکستن چیزی در قسمت دیگری از برنامه عملکردی را اضافه کنید.
  2. تعداد زیر کلاس ها را کاهش می دهد - زمانی کار می کند که لازم است تعداد موجودیت ها در دو جهت گسترش یابد (به عنوان مثال، تعداد اشکال و تعداد رنگ ها).
  3. کار جداگانه روی دو شاخه مستقل Abstraction و Implementation را امکان پذیر می کند - این کار را می توان توسط دو توسعه دهنده مختلف بدون پرداختن به جزئیات کد یکدیگر انجام داد.
  4. کاهش جفت شدن کلاس ها - تنها جایی که دو کلاس به هم متصل هستند، پل (فیلد Color color) است.
معایب بریج:
  1. بسته به موقعیت خاص و ساختار پروژه به عنوان یک کل، ممکن است تأثیر منفی بر بهره وری برنامه داشته باشد (به عنوان مثال، اگر اشیاء بیشتری نیاز به مقداردهی اولیه داشته باشند).
  2. خوانایی کد را به دلیل نیاز به پیمایش بین کلاس ها پیچیده می کند.

تفاوت با الگوی استراتژی

الگوی پل اغلب با الگوی طراحی دیگر، استراتژی اشتباه گرفته می شود. هر دوی آنها از ترکیب بندی استفاده می کنند (در شکل ها و رنگ ها به عنوان مثال ما از تجمیع استفاده کردیم، اما الگوی Bridge می تواند از ترکیب نیز استفاده کند) با تفویض کار به اشیاء دیگر. اما یک تفاوت بین آنها وجود دارد و بسیار زیاد است. الگوی استراتژی یک الگوی رفتاری است: مشکلات کاملاً متفاوتی را حل می کند. استراتژی اجازه می دهد تا الگوریتم ها قابل تعویض باشند، در حالی که Bridge انتزاع را از پیاده سازی جدا می کند تا امکان انتخاب بین پیاده سازی های مختلف را فراهم کند. یعنی بریج بر خلاف Strategy برای کل ساختارها یا ساختارهای سلسله مراتبی کاربرد دارد. الگوی Bridge می تواند سلاح خوبی در زرادخانه توسعه دهندگان باشد؛ نکته اصلی یافتن موقعیت هایی است که ارزش استفاده از آن را داشته باشد یا از الگوی دیگری استفاده کنید. اگر هنوز با سایر قالب ها آشنا نیستید، این مطالب را بخوانید:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION