Что такое шаблон оформления фасада?

191

Является ли фасад классом, который содержит много других классов?

Что делает это шаблоном дизайна? Для меня это как нормальный класс.

Можете ли вы объяснить мне эту модель фасада ?

Кевин
источник
7
Каждый шаблон проектирования в своей реализации представляет собой набор классов.
Феликс Клинг
1
Шаблон фасада создает простой в использовании интерфейс, скрывая несколько интерфейсов в одном классе. Эта статья имеет больше деталей .
user3199690
хорошо объяснено в этом посте programmerzdojo.com/java-tutorials/...
rishi007bansod
Пришлось разобраться с этим, потому что это "не показывает исследовательские усилия"
Рой 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: Знать, когда их использовать, самая сложная часть. Теоретически шаблоны могут быть простыми, но на практике они сложны. Вы можете научиться этому только на опыте, т.е. кодирование, кодирование, кодирование.
Феликс Клинг
Шаблон дизайна фасада также всегда использовался для сокрытия объекта класса детализации и безопасной подачи общественных API.
13
29
$ in jquery - это простой пример шаблона проектирования фасада, который обеспечивает простой интерфейс и скрывает всю сложность
Ajay Beniwal
для кого-то, ищущего образец дизайна фасада с примером реального мира. я наткнулся на этот короткий юбилей YouTube. надеюсь, что это полезно youtu.be/dLjJo2v2re8
Санкар Ганеш
можем ли мы иметь более одного фасадного слоя для одной системы, когда приложение становится больше?
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
Imho это не очень хороший пример, так как он не подчеркивает вариант использования. Пример показывает, как сказал TO, обычный класс. Ассоциация с оборудованием - это композиция. Может быть, излишним для примера в вики, но использование внедрения зависимостей вместо создания экземпляров подмодулей подчеркнет намерение и, возможно, позволит избежать путаницы в TO.
ManuelSchneid3r
Это удивительный пример, поскольку он просто описывает тысячи слов, чтобы понять саму концепцию. Отдых - это просто детали вокруг различных сценариев, которые можно иметь (конечно, шаблон проектирования не может охватывать каждый сценарий).
Сайед
41

Как объяснялось в предыдущем ответе, он предоставляет простой интерфейс для потребляющего клиента. Например: «смотреть 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");
       }
  }
KaviK
источник
Разрешено ли подсистемам связываться друг с другом, не проходя через OrderFacade? В вашем примере между Paymentи Inventory?
Исуру,
19

Краткое и простое объяснение:

  • Шаблон фасада предоставляет унифицированный интерфейс для набора интерфейсов в подсистеме.
  • Фасад определяет высокоуровневый интерфейс, который облегчает использование подсистемы.

Попытайтесь понять сценарий с
фасадом и без него: если вы хотите перевести деньги с accout1 на account2, то две подсистемы, которые нужно вызвать, это снять со счета1 и внести на счет2.

с фасадом и без

Арун Раадж
источник
Простое и понятное объяснение и пример, спасибо! Не могли бы вы также объяснить, что определяет подсистему? Когда подсистема может состоять из относительно не связанных подклассов / функций, ваше определение применимо практически к любому классу. Должны ли классы подсистемы быть очень тесно связаны, например, формировать модуль или библиотеку, которую можно назвать фасадом фасадом?
Бенни
@Benni Да, подсистема (это будет класс) может состоять из относительно не связанных функций, но фасад - это класс, в котором вы решаете, какие конкретные функции вызывать. Вы хотите заказать «турпакет», вы выбираете отель, такси, рейс в одном месте / форме, а затем внутренне фасад вызывает функции различных соответствующих классов и возвращает вам окончательный результат. Не так ли?
Арун
10

Фасад не должен быть описан как класс, который содержит много других классов. Фактически это интерфейс к этим классам, который должен облегчить использование классов, иначе класс фасадов бесполезен.

llMll
источник
7

По поводу ваших запросов:

Является ли Facade классом, который содержит много других классов?

Да. Это оболочка для многих подсистем в приложении.

Что делает это шаблоном дизайна? Для меня это как нормальный класс

Все шаблоны проектирования тоже являются нормальными классами. @ 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 от TravelFacade внутренне вызывает ниже API подсистем

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

Основные выводы: (из статьи в журнале Pankaj Kumar )

  1. Шаблон фасада больше похож на помощника для клиентских приложений
  2. Фасад шаблон может быть применен в любой точке развития, как правило , когда количество интерфейсов расти и система получает Комплексы х .
  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 Я попытался описать здесь шаблон проектирования фасада на примере процесса проверки ипотечного кредита.
Нилеш Гуле
6

Одним из дополнительных применений шаблона Façade может быть сокращение кривой обучения вашей команды. Позвольте мне привести Вам пример:

Предположим, что ваше приложение должно взаимодействовать с MS Excel, используя объектную модель COM, предоставленную Excel. Один из членов вашей команды знает все API-интерфейсы Excel и создает поверх него Фасад, который выполняет все основные сценарии приложения. Ни одному другому члену команды не нужно тратить время на изучение Excel API. Команда может использовать фасад, не зная внутренних органов или всех объектов MS Excel, участвующих в выполнении сценария. Разве это не здорово?

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

Ананд Патель
источник
5

Другой пример фасада: допустим, ваше приложение подключается к базе данных и отображает результаты в пользовательском интерфейсе. Вы можете использовать фасад, чтобы сделать ваше приложение настраиваемым, например, при работе с базой данных или с фиктивными объектами. Таким образом, вы будете выполнять все вызовы базы данных для класса фасадов, где он будет читать конфигурацию приложения и решит запустить запрос db или вернуть фиктивный объект. таким образом, приложение становится независимым от базы данных в случае, если база данных недоступна.

Айш
источник
5

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

ManojPatra
источник
5

Существует очень хороший реальный пример этой модели - автомобильный стартер .

Как водители, мы просто включаем ключ, и машина заводится. Как можно проще. За кулисами задействованы многие другие автомобильные системы (такие как аккумулятор, двигатель, топливо и т. Д.), Чтобы автомобиль успешно запускался, но они скрыты за стартером.

Как видите, стартер автомобиля - это Фасад. Это дает нам простой в использовании интерфейс, не беспокоясь о сложности всех других автомобильных систем.

Подведем итоги:

Шаблон Facade упрощает и скрывает сложность больших блоков кода или API, предоставляя более понятный, понятный и простой в использовании интерфейс.

Джордан Энев
источник
4

Фасад - это класс с уровнем функциональности, который находится между инструментарием и законченным приложением, предлагая упрощенное использование классов в пакете или подсистеме. Цель шаблона Facade - предоставить интерфейс, который делает подсистему простой в использовании. - Извлечение из книги Design Patterns в C #.

Шон Хантер
источник
4

Фасад обсуждает инкапсуляцию сложной подсистемы в одном объекте интерфейса. Это уменьшает кривую обучения, необходимую для успешного использования подсистемы. Это также способствует отделению подсистемы от ее потенциально многих клиентов. С другой стороны, если Фасад является единственной точкой доступа для подсистемы, он ограничит возможности и гибкость, которые могут понадобиться «опытным пользователям».

Источник: https://sourcemaking.com/design_patterns/facade

острая боль
источник
3

Шаблон проектирования - это общее многократно используемое решение часто встречающейся проблемы в данном контексте при разработке программного обеспечения.

Шаблон проектирования Фасад является структурным шаблоном, поскольку он определяет способ создания отношений между классами или объектами. Шаблон дизайна фасада используется для определения упрощенного интерфейса к более сложной подсистеме.

Шаблон фасада идеален при работе с большим количеством взаимозависимых классов или с классами, которые требуют использования нескольких методов, особенно когда они сложны в использовании или трудны для понимания. Класс фасадов - это «обертка», которая содержит набор элементов, которые легко понять и использовать. Эти участники получают доступ к подсистеме от имени пользователя фасада, скрывая детали реализации.

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

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

Программа-Me-Rev
источник
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

user1694660
источник
1

Шаблон фасада предоставляет унифицированный интерфейс к группе интерфейсов подсистемы. Фасад определяет высокоуровневый интерфейс, который упрощает работу с подсистемой.

Тарас Мельник
источник