برنامه نویسی

الگوی نما – انجمن DEV

Summarize this content to 400 words in Persian Lang

الگوی نما چیست؟

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

چه زمانی از آن استفاده کنیم؟

زمانی که به رابط کاربری ساده ای نیاز دارید که کلاس های زیادی را هماهنگ می کند و کارهای پیچیده را انجام می دهد، از الگوی نما استفاده کنید.

مشکل

شرکت ما قصد فروش یک خودرو را دارد. برای شروع رانندگی، مشتری باید این مراحل را دنبال کند …

در را باز کن
در را باز کن
استارت موتور
داشبورد را روشن کنید
صفحه ناوبری را روشن کنید
اگر بیرون تاریک است، چراغ جلو را روشن کنید
در را ببند
در را قفل کن

حتی یک مشتری هنوز رکاب نزده است، در حال حاضر 8 مرحله وجود دارد.در OOP چگونه خواهد بود؟ در واقع به 5 کلاس مختلف و فراخوانی 8 متد نیاز داریم.

door.unlock();
door.open();
engine.start();
dashBoard.on();
screen.on();
if (isOutsideDark) {
light.on();
}
door.close();
door.lock();

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

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

سوال این است که آیا راه آسان تری برای مشتری برای انجام کارهایی مانند شروع رانندگی، توقف رانندگی و غیره وجود دارد؟ بله، الگوی نما وجود دارد.

راه حل

مشتریکلاینت می تواند از CarFacade برای انجام یک کار استفاده کند و به کلاس های زیرسیستم دسترسی داشته باشد.
CarFacadeرابط ساده ای را برای شروع رانندگی، توقف رانندگی ارائه می دهد.
کلاس های زیر سیستمسیستم پیچیده ای که استفاده از آن سخت است. (برای سادگی، زیرسیستم نه چندان پیچیده ای را پیاده سازی کردم)

ساختار

پیاده سازی در جاوا

پیاده‌سازی کلاس‌های زیرسیستم برای توضیح الگوی نما مهم نیست، بنابراین من این بخش‌ها را حذف می‌کنم، اما می‌توانید در Github من در انتهای این وبلاگ بررسی کنید.

public class CarFacade {

private DashBoard dashBoard;
private Door door;
private Engine engine;
private HeadLight light;
private NavigationScreen screen;

private boolean isOutsideDark;

public CarFacade(DashBoard dashBoard,
Door door,
Engine engine,
HeadLight light,
NavigationScreen screen,
boolean isOutsideDark) {
this.dashBoard = dashBoard;
this.door = door;
this.engine = engine;
this.light = light;
this.screen = screen;
this.isOutsideDark = isOutsideDark;
}

public void startDriving() {
door.unlock();
door.open();
engine.start();
dashBoard.on();
screen.on();
if (isOutsideDark) {
light.on();
}
door.close();
door.lock();
}

public void endDriving() {
light.off();
screen.off();
dashBoard.off();
engine.stop();
door.unlock();
door.open();
}
}

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

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

public class Client {

public static void main(String[] args) {
// Create components
DashBoard dashBoard = new DashBoard();
Door door = new Door();
Engine engine = new Engine();
HeadLight light = new HeadLight();
GPS gps = new GPS();
NavigationScreen screen = new NavigationScreen(gps);

// Instantiates Facade with all the components in the subsystem
CarFacade automatedCar = new CarFacade(dashBoard, door, engine, light, screen, true);

// Use the simplified interface to start and end driving
automatedCar.startDriving();
System.out.println();
automatedCar.endDriving();
}
}

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

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

خروجی:

Unlock the door
Open the door
Start Engine
DashBoard displays speed: 60km/h, fuel remaining: 70%
Navigation screen displays gps: 43.01787, -76.216435
HeadLight is on
Close the door
Lock the door

HeadLight is off
Navigation screen is off
DashBoard is off
Stop Engine
Unlock the door
Open the door

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

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

دام

هیچ دام واقعا شناخته شده ای برای نما وجود ندارد.

مقایسه با الگوی آداپتور

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

در اینجا می توانید تمام پیاده سازی های الگوی طراحی را بررسی کنید.مخزن GitHub

الگوی نما چیست؟

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

چه زمانی از آن استفاده کنیم؟

زمانی که به رابط کاربری ساده ای نیاز دارید که کلاس های زیادی را هماهنگ می کند و کارهای پیچیده را انجام می دهد، از الگوی نما استفاده کنید.

مشکل

شرکت ما قصد فروش یک خودرو را دارد. برای شروع رانندگی، مشتری باید این مراحل را دنبال کند …

  1. در را باز کن
  2. در را باز کن
  3. استارت موتور
  4. داشبورد را روشن کنید
  5. صفحه ناوبری را روشن کنید
  6. اگر بیرون تاریک است، چراغ جلو را روشن کنید
  7. در را ببند
  8. در را قفل کن

حتی یک مشتری هنوز رکاب نزده است، در حال حاضر 8 مرحله وجود دارد.
در OOP چگونه خواهد بود؟ در واقع به 5 کلاس مختلف و فراخوانی 8 متد نیاز داریم.

        door.unlock();
        door.open();
        engine.start();
        dashBoard.on();
        screen.on();
        if (isOutsideDark) {
            light.on();
        }
        door.close();
        door.lock();
وارد حالت تمام صفحه شوید

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

سوال این است که آیا راه آسان تری برای مشتری برای انجام کارهایی مانند شروع رانندگی، توقف رانندگی و غیره وجود دارد؟ بله، الگوی نما وجود دارد.

راه حل

توضیحات تصویر

  1. مشتری
    کلاینت می تواند از CarFacade برای انجام یک کار استفاده کند و به کلاس های زیرسیستم دسترسی داشته باشد.

  2. CarFacade
    رابط ساده ای را برای شروع رانندگی، توقف رانندگی ارائه می دهد.

  3. کلاس های زیر سیستم
    سیستم پیچیده ای که استفاده از آن سخت است. (برای سادگی، زیرسیستم نه چندان پیچیده ای را پیاده سازی کردم)

ساختار

توضیحات تصویر

پیاده سازی در جاوا

پیاده‌سازی کلاس‌های زیرسیستم برای توضیح الگوی نما مهم نیست، بنابراین من این بخش‌ها را حذف می‌کنم، اما می‌توانید در Github من در انتهای این وبلاگ بررسی کنید.

public class CarFacade {

    private DashBoard dashBoard;
    private Door door;
    private Engine engine;
    private HeadLight light;
    private NavigationScreen screen;

    private boolean isOutsideDark;

    public CarFacade(DashBoard dashBoard,
                     Door door,
                     Engine engine,
                     HeadLight light,
                     NavigationScreen screen,
                     boolean isOutsideDark) {
        this.dashBoard = dashBoard;
        this.door = door;
        this.engine = engine;
        this.light = light;
        this.screen = screen;
        this.isOutsideDark = isOutsideDark;
    }

    public void startDriving() {
        door.unlock();
        door.open();
        engine.start();
        dashBoard.on();
        screen.on();
        if (isOutsideDark) {
            light.on();
        }
        door.close();
        door.lock();
    }

    public void endDriving() {
        light.off();
        screen.off();
        dashBoard.off();
        engine.stop();
        door.unlock();
        door.open();
    }
}
وارد حالت تمام صفحه شوید

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

public class Client {

    public static void main(String[] args) {
        // Create components
        DashBoard dashBoard = new DashBoard();
        Door door = new Door();
        Engine engine = new Engine();
        HeadLight light = new HeadLight();
        GPS gps = new GPS();
        NavigationScreen screen = new NavigationScreen(gps);

        // Instantiates Facade with all the components in the subsystem
        CarFacade automatedCar = new CarFacade(dashBoard, door, engine, light, screen, true);

        // Use the simplified interface to start and end driving
        automatedCar.startDriving();
        System.out.println();
        automatedCar.endDriving();
    }
}
وارد حالت تمام صفحه شوید

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

خروجی:

Unlock the door
Open the door
Start Engine
DashBoard displays speed: 60km/h, fuel remaining: 70%
Navigation screen displays gps: 43.01787, -76.216435
HeadLight is on
Close the door
Lock the door

HeadLight is off
Navigation screen is off
DashBoard is off
Stop Engine
Unlock the door
Open the door
وارد حالت تمام صفحه شوید

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

دام

  • هیچ دام واقعا شناخته شده ای برای نما وجود ندارد.

مقایسه با الگوی آداپتور

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

در اینجا می توانید تمام پیاده سازی های الگوی طراحی را بررسی کنید.
مخزن GitHub

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

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

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

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