Який шаблон дизайну фасаду?


191

Чи є фасад класом, який містить безліч інших класів?

Що це робить модель дизайну? Для мене це як звичайний клас.

Чи можете ви пояснити мені цю схему фасаду ?


7
Кожна модель дизайну є у своїй реалізації купа класів.
Фелікс Клінг

1
Шаблон фасаду створює простий у користуванні інтерфейс, приховуючи кілька інтерфейсів в одному класі. У цій статті є детальніше .
користувач3199690

добре пояснено в цьому дописі programmerzdojo.com/java-tutorials/…
rishi007bansod

Довелося придумати це, бо це "не показує зусиль для дослідження"
Roy Truelove

1
@RoyTruelove, роби що хочеш. Не хвилює, якщо є відповідні відповіді на питання. Якась відповідна відповідь на запитання?
Кевін

Відповіді:


190

Шаблон дизайну - це поширений спосіб вирішення повторюваної проблеми. Заняття у всіх моделях дизайну - це просто звичайні класи. Важливим є те, як вони структуровані та як вони працюють разом, щоб вирішити дану проблему найкращим чином.

Фасад шаблон дизайну спрощує інтерфейс до складної системи; тому що він, як правило, складається з усіх класів, які складають підсистеми складної системи.

Фасад захищає користувача від складних деталей системи та надає їм simplified viewйого easy to use. Це також decouplesкод, який використовує систему з деталей підсистем, що спрощує модифікацію системи пізніше.

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

Крім того, що важливо під час вивчення моделей дизайну - це вміти розпізнавати, який шаблон відповідає вашій задачі, а потім використовувати його належним чином. Дуже поширена справа зловживати шаблоном або намагатися пристосувати його до якоїсь проблеми лише тому, що ви це знаєте. Будьте в курсі цих підводних каменів під час навчання \ використання моделей дизайну.


9
@kevin: Знати, коли їх використовувати - найскладніша частина. Теоретично, моделі можуть бути простими, але на практиці вони складні. Ви можете навчитися лише цьому бути досвідом, тобто. кодування, кодування, кодування.
Фелікс Клінг

Шаблон дизайну фасаду також завжди використовується для приховування обладнання деталей та безпечного постачання громадських програм.
1313

29
$ in jquery - просто простий приклад дизайну фасаду, який забезпечує простий інтерфейс і приховує всю складність
Ajay Beniwal

для когось, хто шукає шаблон дизайну фасаду з прикладом реального світу. я натрапив на цю коротку навчальну програму на ютубі. сподіваємось на корисні youtu.be/dLjJo2v2re8
Sankar ganesh

чи може ми мати більше одного шару фасаду для однієї системи, коли додаток зростає?
Jeeva Jsb

100

У Вікіпедії є чудовий приклад фасадного малюнка.

/* Complex parts */

class CPU {
    public void freeze() { ... }
    public void jump(long position) { ... }
    public void execute() { ... }
}

class Memory {
    public void load(long position, byte[] data) { ... }
}

class HardDrive {
    public byte[] read(long lba, int size) { ... }
}

/* Facade */

class ComputerFacade {
    private CPU processor;
    private Memory ram;
    private HardDrive hd;

    public ComputerFacade() {
        this.processor = new CPU();
        this.ram = new Memory();
        this.hd = new HardDrive();
    }

    public void start() {
        processor.freeze();
        ram.load(BOOT_ADDRESS, hd.read(BOOT_SECTOR, SECTOR_SIZE));
        processor.jump(BOOT_ADDRESS);
        processor.execute();
    }
}

/* Client */

class You {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

6
Це хороший приклад. Клієнт повинен вміти складати всі етапи у фасаді, якщо він теж вибере, нічого не слід приховувати приватними методами.
Роб

2
Імхо, це не гарний приклад, оскільки це не наголошує на застосуванні. Приклад просто показує, як сказав TO, звичайний клас. Асоціація до апаратних засобів - це композиція. Можливо, надмірність для прикладу на wiki, але використання ін'єкції залежності замість інстанції підмодулів підкреслить намір і, можливо, уникне плутанини TO.
ManuelSchneid3r

Це дивовижний приклад, оскільки він просто загортає тисячі слів у двох словах, щоб зрозуміти саму концепцію. Відпочинок - це лише деталі навколо різних сценаріїв (звичайно, модель дизайну ніколи не може охоплювати кожен сценарій).
Сайед

41

Як пояснено в попередній відповіді, він забезпечує простий інтерфейс для споживача. Наприклад: "watch ESPN" - призначена функція. Але це включає кілька кроків, таких як:

  1. Увімкніть телевізор, якщо потрібно;
  2. Перевірте наявність супутникового / кабельного функціонування;
  3. Перейдіть на ESPN, якщо потрібно.

Але фасад спростить це і просто надасть клієнту функцію "спостерігати за ESPN".


29

Фасад приховує складності системи та забезпечує інтерфейс для клієнта, звідки клієнт може отримати доступ до системи.

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }

Чи дозволяється підсистемам спілкуватися між собою, не проходячи через OrderFacade? У вашому прикладі між Paymentі Inventory?
Ісуру

19

Коротке і просте пояснення:

  • Шаблон фасаду забезпечує уніфікований інтерфейс для набору інтерфейсів (ів) в підсистемі.
  • Фасад визначає інтерфейс вищого рівня, який полегшує використання підсистеми.

Спробуйте зрозуміти сценарій з фасадом і без нього.
Якщо ви хочете перевести гроші з акаунта1 на рахунок2, то дві підсистеми, на які слід звернутись, зніміть з рахунку1 і внесіть на рахунок2.

з фасадом і без нього


Просте і зрозуміле пояснення та приклад, дякую! Чи можете ви також пояснити, що визначає підсистему? Якщо підсистема може складатися з відносно неспоріднених підкласів / функцій, ваше визначення стосується майже будь-якого класу. Чи повинні класи підсистеми бути дуже тісно пов'язані, наприклад, формувати модуль або бібліотеку, щоб можна було назвати фасад фасадом?
Бенні

@Benni Так, підсистема (це був би клас) може складатися з відносно непов'язаних функцій, але фасад - це клас, у якому ви вирішуєте, які конкретні функції потрібно викликати. Ви хочете забронювати "туристичний пакет", ви вибираєте готель, кабіну, політ в одному місці / формі, потім внутрішньо фасад викликає функції різних відповідних класів і повертає вам кінцевий результат. Чи не так?
Арун

10

Фасад не слід описувати як клас, який містить безліч інших класів. Насправді це інтерфейс до цих класів і повинен полегшити використання класів, інакше клас фасаду марний.


7

Щодо ваших запитів:

Чи є Фасад класом, який містить безліч інших класів?

Так. Це обгортка для багатьох підсистем у застосуванні.

Що це робить модель дизайну? Для мене це як звичайний клас

Усі шаблони дизайну теж є звичайними класами. @ Unmesh Kondolikar правильно відповів на цей запит.

Чи можете ви пояснити мені цей фасад, я новачок у дизайні моделей.

Відповідно до GoF, модель дизайну фасаду визначається як:

Забезпечте уніфікований інтерфейс до набору інтерфейсів у підсистемі. Фасадний малюнок визначає інтерфейс вищого рівня, що полегшує використання підсистеми

Фасад шаблон зазвичай використовується , коли:

  1. Для доступу до складної системи потрібен простий інтерфейс.
  2. Абстракції та реалізації підсистеми тісно пов'язані між собою.
  3. Потрібна точка входу до кожного рівня шаруватого програмного забезпечення.
  4. Система дуже складна або її важко зрозуміти.

Візьмемо реальний приклад слова веб-сайту cleartrip .

Цей веб-сайт пропонує варіанти бронювання

  1. Рейси
  2. Готелі
  3. Рейси + Готелі

Фрагмент коду:

import java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

Пояснення:

  1. FlightBooking, TrainBooking and HotelBooking це різні підсистеми великої системи: TravelFacade

  2. TravelFacade пропонує простий інтерфейс для замовлення одного з наведених нижче варіантів

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. API API від TravelFacade внутрішньо дзвонить нижче API підсистем

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. Таким чином, TravelFacadeнадається простіший і простіший API без викриття API підсистеми.

Ключові вивезення : (зі статті журналу Pande Kumar )

  1. Шаблон фасаду більше схожий на помічник для клієнтських додатків
  2. Шаблон фасаду можна застосувати в будь-якій точці розвитку, як правило, коли кількість інтерфейсів зростає і система отримує завершення x .
  3. Інтерфейси підсистеми не знають про Фасад, і вони не повинні мати жодної посилання на інтерфейс Фасад
  4. Фасадну схему слід застосовувати для подібних інтерфейсів , її мета полягає у створенні єдиного інтерфейсу, а не декількох інтерфейсів, що виконує аналогічні завдання

Перегляньте також статтю про створення джерела для кращого розуміння.


6

Шаблон фасаду - це обгортка багатьох інших інтерфейсів, в результаті чого створюється більш простий інтерфейс.

Шаблони дизайну корисні, оскільки вони вирішують повторювані проблеми і взагалі спрощують код. У команді розробників, які погоджуються використовувати ті самі шаблони, це підвищує ефективність та розуміння при підтримці коду один одного.

Спробуйте прочитати більше моделей:

Шаблон фасаду: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

або загальніше: http://www.dofactory.com/Patterns/Patterns.aspx


nileshgule.com/2012/07/facade-design-pattern.html Я спробував описати тут схему дизайну фасаду на прикладі процесу підтвердження домашнього кредиту.
Nilesh Gule

6

Одним із додаткових застосувань моделі «Фасад» може бути зменшення кривої навчання вашої команди. Дозвольте навести приклад:

Припустимо, що ваша програма потребує взаємодії з MS Excel, використовуючи модель об'єкта COM, надану Excel. Один з членів вашої команди знає всі API Excel, і він створює поверх нього фасад, який виконує всі основні сценарії програми. Жодному іншому члену команди не потрібно витрачати час на вивчення Excel API. Команда може використовувати фасад, не знаючи внутрішніх або всіх об'єктів MS Excel, які беруть участь у виконанні сценарію. Хіба це не чудово?

Таким чином, він забезпечує спрощений та уніфікований інтерфейс поверх складної підсистеми.


5

Ще один приклад фасаду: скажімо, ваша програма підключається до бази даних та відображає результати в інтерфейсі. Ви можете використовувати фасад, щоб зробити програму настроюваною, як це виконується за допомогою бази даних або з макетними об'єктами. Таким чином, ви будете робити всі дзвінки до бази даних до класу фасадів, де він буде читати конфігурацію програми та вирішує запустити запит db або повернути макетний об’єкт. таким чином додаток стає незалежним у випадку, коли db недоступний.


5

Фасад відкриває спрощені функції, які в основному називаються, а реалізація приховує складність, з якою інакше доведеться стикатися з клієнтами. Взагалі реалізація використовує декілька пакетів, класів та функцій там. Добре написані фасади роблять прямий доступ до інших класів рідкісними. Наприклад, коли я відвідую банкомат і знімаю певну суму. Банкомат приховує, чи йде він прямо до банку, що належить йому, чи переходить через узгоджену мережу для зовнішнього банку. Банкомат діє як фасад, що споживає декілька пристроїв та підсистем, з якими мені не доводиться безпосередньо займатися як клієнт.


5

Є дуже хороший приклад реальної роботи - Автомобільний стартер .

Як водії, ми просто включаємо ключ і машина заводиться. Як можна простіше. За лаштунками бере участь багато інших автомобільних систем (як акумулятор, двигун, паливо тощо), щоб автомобіль запустився успішно, але вони приховані за стартером.

Як бачите, автомобільний стартер - це Фасад. Це дає нам простий у користуванні інтерфейс, не турбуючись про складність всіх інших автомобільних систем.

Підведемо підсумки:

Шаблон фасаду спрощує та приховує складність великих кодових блоків чи API, забезпечуючи більш чистий, зрозумілий та простий у користуванні інтерфейс.


4

Фасад - це клас з рівнем функціональності, який лежить між набором інструментів і повною програмою, що пропонує спрощене використання класів у пакеті або підсистемі. Метою моделі "Фасад" є створення інтерфейсу, який робить підсистему простою у використанні. - Витяг із шаблонів дизайну книги в C #.


4

Фасад обговорює інкапсуляцію складної підсистеми в межах одного інтерфейсного об'єкта. Це зменшує криву навчання, необхідну для успішного використання підсистеми. Він також сприяє від'єднанню підсистеми від потенційно багатьох клієнтів. З іншого боку, якщо Фасад є єдиною точкою доступу для підсистеми, це обмежить функції та гнучкість, які можуть знадобитися "енергокористувачам".

Джерело: https://sourcemaking.com/design_patterns/facade


3

Шаблон дизайну є загальним для багаторазового вирішення поширеної проблеми в заданому контексті при розробці програмного забезпечення.

Шаблон оформлення фасаду є структурним малюнком, оскільки він визначає спосіб створення взаємозв'язків між класами або сутностями. Шаблон дизайну фасаду використовується для визначення спрощеного інтерфейсу до більш складної підсистеми.

Шаблон фасаду ідеально підходить для роботи з великою кількістю взаємозалежних класів або для класів, які потребують використання декількох методів, особливо коли вони складні у використанні або важкі для розуміння. Клас фасаду - це "обгортка", яка містить набір членів, які легко зрозуміти і прості у використанні. Ці учасники отримують доступ до підсистеми від імені користувача фасаду, приховуючи деталі реалізації.

Шаблон оформлення фасаду особливо корисний при обгортанні підсистем, які погано розроблені, але не можуть бути відновлені, оскільки вихідний код недоступний або існуючий інтерфейс широко використовується. Іноді ви можете вирішити реалізувати більше одного фасаду, щоб надати підмножини функціональності для різних цілей.

Одним із прикладів використання фасадної схеми є інтеграція веб-сайту з бізнес-додатком. Існуюче програмне забезпечення може включати велику кількість ділової логіки, до якої потрібно отримати доступ певним чином. Веб-сайт може вимагати лише обмеженого доступу до цієї бізнес-логіки. Наприклад, на веб-сайті може знадобитися показати, чи досяг товар для продажу обмеженого рівня запасів. Метод IsLowStock класу фасадів може повернути булеве значення для позначення цього. За лаштунками цього методу можна було приховати складності обробки поточного фізичного запасу, вхідних запасів, виділених предметів та низький рівень запасів для кожного товару.


2

Усі шаблони дизайну - це деякі класи, організовані так чи інакше, що відповідають конкретній програмі. Мета візерунка фасаду - приховати складність операції чи операцій. Ви можете побачити приклад та дізнатись шаблон фасаду на веб-сайті http://preciselyconcise.com/design_patterns/facade.php


2

Це просто створення обгортки для виклику декількох методів. У вас є клас A методом x () і y () і клас B з методами k () і z (). Ви хочете зателефонувати x, y, z одразу, щоб це зробити за допомогою шаблону Facade, ви просто створите клас Facade і створіть метод, який дозволяє сказати xyz (). Замість виклику кожного методу (x, y і z) окремо ви просто викликаєте метод обгортки (xyz ()) класу фасаду, який викликає ці методи.

Аналогічна схема є сховищем, але це переважно для рівня доступу до даних.


1

Це в основному одна система очищення вікон. Ви призначаєте будь-яку роботу, яку вона делегує певному методу в іншому класі.


1

Шаблон дизайну фасаду підпадає під шаблон структурного дизайну. Коротше кажучи, Фасад означає зовнішній вигляд. Це означає, що в дизайні фасаду ми щось приховуємо і показуємо лише те, що насправді вимагає клієнт. Детальніше читайте в блозі нижче: http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html


1

Шаблон фасаду забезпечує єдиний інтерфейс для групи інтерфейсів підсистеми. Фасад визначає інтерфейс високого рівня, що спрощує роботу з підсистемою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.