برنامه نویسی

درک الگوی طراحی پل: راهنمای جامع

Summarize this content to 400 words in Persian Lang
در دنیای الگوهای طراحی نرم افزار، الگوی طراحی پل به عنوان یک ابزار قدرتمند برای جدا کردن انتزاع از پیاده سازی برجسته می شود و به هر دو اجازه می دهد به طور مستقل متفاوت باشند. این به ویژه در هنگام برخورد با سیستم های پیچیده که در آن شما نیاز به جداسازی رابط از پیاده سازی بدون اجبار آنها به ساختارهای سفت و سخت دارید، مفید است. این به شما امکان می دهد یک کلاس بزرگ یا مجموعه ای از کلاس های نزدیک به هم را به دو سلسله مراتب مجزا تقسیم کنید – انتزاع و پیاده سازی – که می توانند مستقل از یکدیگر توسعه یابند.

این وبلاگ به بررسی این موضوع می پردازد الگوی طراحی پل، مفاهیم آن را توضیح دهید، مثال های واقعی ارائه دهید و نحوه پیاده سازی آن را در جاوا به نمایش بگذارید.

الگوی طراحی پل چیست؟

را الگوی طراحی پل یک الگوی ساختاری است که برای “جدا کردن” یک انتزاع از اجرای آن استفاده می شود تا این دو بتوانند به طور مستقل متفاوت باشند. این الگو به ویژه زمانی مفید است که چندین پیاده‌سازی ممکن برای یک انتزاع معین داشته باشید، و می‌خواهید از تعداد زیادی زیر کلاس برای مدیریت همه ترکیب‌های انتزاع و پیاده‌سازی اجتناب کنید.

به زبان ساده تر:

انتزاع به نمای سطح بالا (مثلاً رابط یا کلاس انتزاعی) اشاره دارد.

پیاده سازی به پیاده سازی سطح پایین (به عنوان مثال، کلاس ها یا سیستم های بتنی) اشاره دارد.

الگوی طراحی پل یک پل (رابط) بین این دو عنصر را فراهم می کند و به شما این امکان را می دهد که یکی را بدون تأثیر بر دیگری تغییر دهید.

چه زمانی از الگوی طراحی پل استفاده کنیم؟

شما باید الگوی Bridge را در سناریوهای زیر در نظر بگیرید:

زمانی که هم انتزاع و هم پیاده‌سازی می‌توانند به طور مستقل متفاوت باشند، و می‌خواهید از انفجار زیر کلاس‌ها که از تلاش برای ترکیب هر انتزاع با هر پیاده‌سازی ناشی می‌شود، جلوگیری کنید.
زمانی که می خواهید انعطاف پذیری و مقیاس پذیری را در سیستم خود بهبود بخشید.
زمانی که نیاز به تغییر پیاده سازی بدون تغییر انتزاع دارید (یا برعکس).

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

الگوی پل شامل اجزای کلیدی زیر است:

انتزاع: این رابط کنترل سطح بالا را تعریف می کند که حاوی ارجاع به یک شی از نوع است Implementor و ممکن است برخی وظایف را به آن محول کند.

Refined Abstraction: یک نسخه تصفیه شده از Abstraction که رابط اصلی انتزاع را گسترش می دهد.

مجری: این رابط را برای کلاس های پیاده سازی تعریف می کند. این خود اجرای ملموس نیست، بلکه پلی برای آن است.

ConcreteImplementor: اجرای ملموس Implementor رابطی که اجرای واقعی عملیات تعریف شده در را فراهم می کند Implementor.

ساختار الگوی پل

Abstraction
|
+——————+
| |
RefinedAbstraction Implementor
|
+——————-+
| |
ConcreteImplementorA ConcreteImplementorB

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال: سیستم کنترل از راه دور

بیایید از مثال a استفاده کنیم سیستم کنترل از راه دور برای انواع دستگاه های الکترونیکی برای نشان دادن الگوی پل. تصور کنید ما انواع مختلفی از دستگاه ها (مانند تلویزیون، رادیو) و کنترل های مختلف از راه دور (مانند BasicRemote، AdvancedRemote) داریم.

بدون الگوی پل، اگر بخواهیم این تغییرات را ترکیب کنیم، برای هر ترکیب به یک زیر کلاس نیاز داریم که منجر به سلسله مراتب کلاس بزرگی می شود:

BasicRemoteTV، AdvancedRemoteTV، BasicRemoteRadio، AdvancedRemoteRadio، و غیره.

این به سرعت غیرقابل کنترل می شد. در عوض، با اعمال الگوی Bridge، می‌توانیم آن را جدا کنیم رابط کنترل از راه دور از رابط دستگاه، سیستم را انعطاف پذیرتر و مقیاس پذیرتر می کند.

الگوی پل گام به گام در جاوا

مرحله 1: تعریف کنید Implementor رابط

// The Implementor defines the interface for implementation classes.
public interface Device {
void turnOn();
void turnOff();
void setVolume(int volume);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله ۲: پیاده‌کننده‌های بتن برای دستگاه‌ها ایجاد کنید

// ConcreteImplementorA: A TV device
public class TV implements Device {
private boolean on = false;
private int volume = 10;

@Override
public void turnOn() {
on = true;
System.out.println(“TV is now ON”);
}

@Override
public void turnOff() {
on = false;
System.out.println(“TV is now OFF”);
}

@Override
public void setVolume(int volume) {
this.volume = volume;
System.out.println(“TV Volume set to ” + volume);
}
}

// ConcreteImplementorB: A Radio device
public class Radio implements Device {
private boolean on = false;
private int volume = 5;

@Override
public void turnOn() {
on = true;
System.out.println(“Radio is now ON”);
}

@Override
public void turnOff() {
on = false;
System.out.println(“Radio is now OFF”);
}

@Override
public void setVolume(int volume) {
this.volume = volume;
System.out.println(“Radio Volume set to ” + volume);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: تعریف کنید Abstraction کلاس

// The Abstraction defines the interface for using the remote control.
public abstract class RemoteControl {
protected Device device;

public RemoteControl(Device device) {
this.device = device;
}

public abstract void turnOn();
public abstract void turnOff();
public abstract void setVolume(int volume);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4: ایجاد انتزاعات اصلاح شده برای انواع مختلف از راه دور

// RefinedAbstraction: A basic remote control
public class BasicRemote extends RemoteControl {

public BasicRemote(Device device) {
super(device);
}

@Override
public void turnOn() {
device.turnOn();
}

@Override
public void turnOff() {
device.turnOff();
}

@Override
public void setVolume(int volume) {
device.setVolume(volume);
}
}

// RefinedAbstraction: An advanced remote control with additional features
public class AdvancedRemote extends RemoteControl {

public AdvancedRemote(Device device) {
super(device);
}

@Override
public void turnOn() {
device.turnOn();
}

@Override
public void turnOff() {
device.turnOff();
}

@Override
public void setVolume(int volume) {
device.setVolume(volume);
}

// Additional functionality like mute
public void mute() {
System.out.println(“Muting the device”);
device.setVolume(0);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 5: استفاده از الگوی پل

اکنون می توانیم از الگوی Bridge برای کنترل دستگاه ها با استفاده از انواع مختلف ریموت استفاده کنیم:

public class BridgePatternExample {
public static void main(String[] args) {
// Use TV with Basic Remote
Device tv = new TV();
RemoteControl basicRemote = new BasicRemote(tv);

basicRemote.turnOn();
basicRemote.setVolume(20);
basicRemote.turnOff();

System.out.println(“\n—“);

// Use Radio with Advanced Remote
Device radio = new Radio();
RemoteControl advancedRemote = new AdvancedRemote(radio);

advancedRemote.turnOn();
advancedRemote.setVolume(15);
((AdvancedRemote) advancedRemote).mute();
advancedRemote.turnOff();
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی:

TV is now ON
TV Volume set to 20
TV is now OFF


Radio is now ON
Radio Volume set to 15
Muting the device
Radio is now OFF

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایای الگوی پل

تفکیک نگرانی ها: الگو انتزاع (کنترل از راه دور) را از پیاده سازی (دستگاه) جدا می کند، که اصلاح یکی را بدون تأثیر بر دیگری آسان تر می کند.

انعطاف پذیری بهبود یافته: می توانید دستگاه یا کنترل از راه دور را بدون تغییر در قسمت دیگر تغییر دهید.

کاهش تکرار کد: با اجازه دادن به انتزاعات و پیاده سازی ها به طور مستقل از ایجاد زیر کلاس های غیر ضروری جلوگیری می کنید.

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

افزایش پیچیدگی: افزودن یک لایه اضافی از انتزاع ممکن است پیچیدگی کد را به خصوص برای سیستم های ساده افزایش دهد.

غیر جهت: اضافه شدن غیرمستقیم بین انتزاع و پیاده سازی گاهی اوقات می تواند درک کد را سخت تر کند.

نتیجه گیری

الگوی طراحی پل روشی زیبا برای مدیریت سیستم های پیچیده است که در آن هم انتزاعات و هم پیاده سازی آن ها باید به طور مستقل متفاوت باشند. با جدا کردن این نگرانی ها، الگوی Bridge انعطاف پذیری، مقیاس پذیری و قابلیت نگهداری سیستم را بهبود می بخشد.

در این پست نحوه اعمال الگوی Bridge را با استفاده از a نشان دادیم سیستم کنترل از راه دور به عنوان نمونه با استفاده از الگوی Bridge در جاوا، دیدیم که چگونه دستگاه‌های مختلف را می‌توان با چندین نوع کنترل از راه دور بدون نیاز به انفجار زیر کلاس‌ها کنترل کرد.

منابع برای مطالعه بیشتر

الگوهای طراحی: عناصر نرم افزار شی گرا قابل استفاده مجدد توسط اریش گاما، ریچارد هلم، رالف جانسون، جان ولیسیدز.

الگوهای طراحی اول سر توسط اریک فریمن، الیزابت رابسون.
Refactoring Guru – الگوی پل

در دنیای الگوهای طراحی نرم افزار، الگوی طراحی پل به عنوان یک ابزار قدرتمند برای جدا کردن انتزاع از پیاده سازی برجسته می شود و به هر دو اجازه می دهد به طور مستقل متفاوت باشند. این به ویژه در هنگام برخورد با سیستم های پیچیده که در آن شما نیاز به جداسازی رابط از پیاده سازی بدون اجبار آنها به ساختارهای سفت و سخت دارید، مفید است. این به شما امکان می دهد یک کلاس بزرگ یا مجموعه ای از کلاس های نزدیک به هم را به دو سلسله مراتب مجزا تقسیم کنید – انتزاع و پیاده سازی – که می توانند مستقل از یکدیگر توسعه یابند.

این وبلاگ به بررسی این موضوع می پردازد الگوی طراحی پل، مفاهیم آن را توضیح دهید، مثال های واقعی ارائه دهید و نحوه پیاده سازی آن را در جاوا به نمایش بگذارید.


الگوی طراحی پل چیست؟

را الگوی طراحی پل یک الگوی ساختاری است که برای “جدا کردن” یک انتزاع از اجرای آن استفاده می شود تا این دو بتوانند به طور مستقل متفاوت باشند. این الگو به ویژه زمانی مفید است که چندین پیاده‌سازی ممکن برای یک انتزاع معین داشته باشید، و می‌خواهید از تعداد زیادی زیر کلاس برای مدیریت همه ترکیب‌های انتزاع و پیاده‌سازی اجتناب کنید.

به زبان ساده تر:

  • انتزاع به نمای سطح بالا (مثلاً رابط یا کلاس انتزاعی) اشاره دارد.
  • پیاده سازی به پیاده سازی سطح پایین (به عنوان مثال، کلاس ها یا سیستم های بتنی) اشاره دارد.

الگوی طراحی پل یک پل (رابط) بین این دو عنصر را فراهم می کند و به شما این امکان را می دهد که یکی را بدون تأثیر بر دیگری تغییر دهید.

چه زمانی از الگوی طراحی پل استفاده کنیم؟

شما باید الگوی Bridge را در سناریوهای زیر در نظر بگیرید:

  • زمانی که هم انتزاع و هم پیاده‌سازی می‌توانند به طور مستقل متفاوت باشند، و می‌خواهید از انفجار زیر کلاس‌ها که از تلاش برای ترکیب هر انتزاع با هر پیاده‌سازی ناشی می‌شود، جلوگیری کنید.
  • زمانی که می خواهید انعطاف پذیری و مقیاس پذیری را در سیستم خود بهبود بخشید.
  • زمانی که نیاز به تغییر پیاده سازی بدون تغییر انتزاع دارید (یا برعکس).

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

الگوی پل شامل اجزای کلیدی زیر است:

  1. انتزاع: این رابط کنترل سطح بالا را تعریف می کند که حاوی ارجاع به یک شی از نوع است Implementor و ممکن است برخی وظایف را به آن محول کند.
  2. Refined Abstraction: یک نسخه تصفیه شده از Abstraction که رابط اصلی انتزاع را گسترش می دهد.
  3. مجری: این رابط را برای کلاس های پیاده سازی تعریف می کند. این خود اجرای ملموس نیست، بلکه پلی برای آن است.
  4. ConcreteImplementor: اجرای ملموس Implementor رابطی که اجرای واقعی عملیات تعریف شده در را فراهم می کند Implementor.

ساختار الگوی پل

        Abstraction
            |
   +------------------+
   |                  |
RefinedAbstraction  Implementor
                        |
             +-------------------+
             |                   |
    ConcreteImplementorA    ConcreteImplementorB
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مثال: سیستم کنترل از راه دور

بیایید از مثال a استفاده کنیم سیستم کنترل از راه دور برای انواع دستگاه های الکترونیکی برای نشان دادن الگوی پل. تصور کنید ما انواع مختلفی از دستگاه ها (مانند تلویزیون، رادیو) و کنترل های مختلف از راه دور (مانند BasicRemote، AdvancedRemote) داریم.

بدون الگوی پل، اگر بخواهیم این تغییرات را ترکیب کنیم، برای هر ترکیب به یک زیر کلاس نیاز داریم که منجر به سلسله مراتب کلاس بزرگی می شود:

  • BasicRemoteTV، AdvancedRemoteTV، BasicRemoteRadio، AdvancedRemoteRadio، و غیره.

این به سرعت غیرقابل کنترل می شد. در عوض، با اعمال الگوی Bridge، می‌توانیم آن را جدا کنیم رابط کنترل از راه دور از رابط دستگاه، سیستم را انعطاف پذیرتر و مقیاس پذیرتر می کند.


الگوی پل گام به گام در جاوا

مرحله 1: تعریف کنید Implementor رابط

// The Implementor defines the interface for implementation classes.
public interface Device {
    void turnOn();
    void turnOff();
    void setVolume(int volume);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله ۲: پیاده‌کننده‌های بتن برای دستگاه‌ها ایجاد کنید

// ConcreteImplementorA: A TV device
public class TV implements Device {
    private boolean on = false;
    private int volume = 10;

    @Override
    public void turnOn() {
        on = true;
        System.out.println("TV is now ON");
    }

    @Override
    public void turnOff() {
        on = false;
        System.out.println("TV is now OFF");
    }

    @Override
    public void setVolume(int volume) {
        this.volume = volume;
        System.out.println("TV Volume set to " + volume);
    }
}

// ConcreteImplementorB: A Radio device
public class Radio implements Device {
    private boolean on = false;
    private int volume = 5;

    @Override
    public void turnOn() {
        on = true;
        System.out.println("Radio is now ON");
    }

    @Override
    public void turnOff() {
        on = false;
        System.out.println("Radio is now OFF");
    }

    @Override
    public void setVolume(int volume) {
        this.volume = volume;
        System.out.println("Radio Volume set to " + volume);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: تعریف کنید Abstraction کلاس

// The Abstraction defines the interface for using the remote control.
public abstract class RemoteControl {
    protected Device device;

    public RemoteControl(Device device) {
        this.device = device;
    }

    public abstract void turnOn();
    public abstract void turnOff();
    public abstract void setVolume(int volume);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4: ایجاد انتزاعات اصلاح شده برای انواع مختلف از راه دور

// RefinedAbstraction: A basic remote control
public class BasicRemote extends RemoteControl {

    public BasicRemote(Device device) {
        super(device);
    }

    @Override
    public void turnOn() {
        device.turnOn();
    }

    @Override
    public void turnOff() {
        device.turnOff();
    }

    @Override
    public void setVolume(int volume) {
        device.setVolume(volume);
    }
}

// RefinedAbstraction: An advanced remote control with additional features
public class AdvancedRemote extends RemoteControl {

    public AdvancedRemote(Device device) {
        super(device);
    }

    @Override
    public void turnOn() {
        device.turnOn();
    }

    @Override
    public void turnOff() {
        device.turnOff();
    }

    @Override
    public void setVolume(int volume) {
        device.setVolume(volume);
    }

    // Additional functionality like mute
    public void mute() {
        System.out.println("Muting the device");
        device.setVolume(0);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 5: استفاده از الگوی پل

اکنون می توانیم از الگوی Bridge برای کنترل دستگاه ها با استفاده از انواع مختلف ریموت استفاده کنیم:

public class BridgePatternExample {
    public static void main(String[] args) {
        // Use TV with Basic Remote
        Device tv = new TV();
        RemoteControl basicRemote = new BasicRemote(tv);

        basicRemote.turnOn();
        basicRemote.setVolume(20);
        basicRemote.turnOff();

        System.out.println("\n---");

        // Use Radio with Advanced Remote
        Device radio = new Radio();
        RemoteControl advancedRemote = new AdvancedRemote(radio);

        advancedRemote.turnOn();
        advancedRemote.setVolume(15);
        ((AdvancedRemote) advancedRemote).mute();
        advancedRemote.turnOff();
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی:

TV is now ON
TV Volume set to 20
TV is now OFF

---
Radio is now ON
Radio Volume set to 15
Muting the device
Radio is now OFF
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مزایای الگوی پل

  • تفکیک نگرانی ها: الگو انتزاع (کنترل از راه دور) را از پیاده سازی (دستگاه) جدا می کند، که اصلاح یکی را بدون تأثیر بر دیگری آسان تر می کند.
  • انعطاف پذیری بهبود یافته: می توانید دستگاه یا کنترل از راه دور را بدون تغییر در قسمت دیگر تغییر دهید.
  • کاهش تکرار کد: با اجازه دادن به انتزاعات و پیاده سازی ها به طور مستقل از ایجاد زیر کلاس های غیر ضروری جلوگیری می کنید.

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

  • افزایش پیچیدگی: افزودن یک لایه اضافی از انتزاع ممکن است پیچیدگی کد را به خصوص برای سیستم های ساده افزایش دهد.
  • غیر جهت: اضافه شدن غیرمستقیم بین انتزاع و پیاده سازی گاهی اوقات می تواند درک کد را سخت تر کند.

نتیجه گیری

الگوی طراحی پل روشی زیبا برای مدیریت سیستم های پیچیده است که در آن هم انتزاعات و هم پیاده سازی آن ها باید به طور مستقل متفاوت باشند. با جدا کردن این نگرانی ها، الگوی Bridge انعطاف پذیری، مقیاس پذیری و قابلیت نگهداری سیستم را بهبود می بخشد.

در این پست نحوه اعمال الگوی Bridge را با استفاده از a نشان دادیم سیستم کنترل از راه دور به عنوان نمونه با استفاده از الگوی Bridge در جاوا، دیدیم که چگونه دستگاه‌های مختلف را می‌توان با چندین نوع کنترل از راه دور بدون نیاز به انفجار زیر کلاس‌ها کنترل کرد.


منابع برای مطالعه بیشتر

  1. الگوهای طراحی: عناصر نرم افزار شی گرا قابل استفاده مجدد توسط اریش گاما، ریچارد هلم، رالف جانسون، جان ولیسیدز.
  2. الگوهای طراحی اول سر توسط اریک فریمن، الیزابت رابسون.
  3. Refactoring Guru – الگوی پل

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا