Что такое шаблон дизайна фасада?

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

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

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

19 ответов

Решение

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

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

Фасад защищает пользователя от сложных деталей системы и предоставляет им simplified view это что easy to use, Это также decouples код, который использует систему из деталей подсистем, облегчая модификацию системы позже.

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

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

Кроме того, при изучении шаблонов проектирования важно уметь распознавать, какой шаблон соответствует вашей задаче, а затем использовать его соответствующим образом. Очень часто неправильно использовать шаблон или пытаться приспособить его к какой-либо проблеме только потому, что вы это знаете. Помните об этих подводных камнях при изучении \ использовании шаблонов проектирования.

В Википедии есть отличный пример шаблона Фасад.

/* 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();
    }
}

Как объяснялось в предыдущем ответе, он предоставляет простой интерфейс для потребляющего клиента. Например: "смотреть ESPN" является предполагаемой функцией. Но это включает в себя несколько шагов, таких как:

  1. При необходимости включите телевизор;
  2. Проверьте работоспособность спутника / кабеля;
  3. Переключитесь на ESPN, если требуется.

Но фасад упростит это и просто предоставит клиенту функцию "смотреть ESPN".

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

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");
       }
  }

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

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

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

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

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

Что касается ваших запросов:

Является ли 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. Шаблон фасада должен применяться для интерфейсов аналогичного типа, его цель - предоставить один интерфейс, а не несколько интерфейсов, выполняющих аналогичные виды работ.

Взгляните на статью по созданию источников, чтобы лучше понять.

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

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

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

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

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

Попробуйте прочитать больше шаблонов:

Схема фасада: http://www.dofactory.com/Patterns/PatternFacade.aspx

или в более общем плане: http://www.dofactory.com/Patterns/Patterns.aspx

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

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

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

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

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

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

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

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

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

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

Это просто создание оболочки для вызова нескольких методов. У вас есть класс A с методами x () и y () и класс B с методами k() и z (). Вы хотите вызвать x, y, z сразу, чтобы сделать это, используя шаблон Facade, вы просто создаете класс Facade и создаете метод, скажем, xyz (). Вместо того, чтобы вызывать каждый метод (x, y и z) по отдельности, вы просто вызываете метод-обертку (xyz ()) класса фасадов, который вызывает эти методы.

Подобный шаблон - хранилище, но в основном для уровня доступа к данным.

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

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

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

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

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

Мне нравится пример из Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates - Head First Design Patternsкнига. Пример: предположим, что вы создали домашний кинотеатр и наконец хотите посмотреть фильм. Итак, вам необходимо сделать:

        Amplifier amplifier = new Amplifier();
        CdPlayer cdPlayer = new CdPlayer();
        DvdPlayer dvdPlayer = new DvdPlayer();
        Lights lights = new Lights();
        PopcornPopper popcornPopper = new PopcornPopper();
        Projector projector = new Projector();
        Screen screen = new Screen();

        popcornPopper.turnOn();
        popcornPopper.pop();
        amplifier.turnOn();
        amplifier.setVolume(10);
        lights.turnOn();
        lights.dim(10);
        screen.up();
        dvdPlayer.turnOn();
        dvdPlayer.play();

что происходит, когда фильм заканчивается? Вы должны сделать то же самое, но в обратном порядке, поэтому сложность просмотра и завершения фильма становится очень сложной. Паттерн фасад говорит, что вы можете создать фасад и позволить пользователю просто вызывать один метод вместо того, чтобы вызывать все это. Создадим фасад:

public class HomeTheatherFacade {
    Amplifier amplifier;
    DvdPlayer dvdPlayer;
    CdPlayer cdPlayer;
    Projector projector;
    Lights lights;
    Screen screen;
    PopcornPopper popcornPopper;

    public HomeTheatherFacade(Amplifier amplifier, DvdPlayer dvdPlayer, CdPlayer cdPlayer, Projector projector, Lights lights, Screen screen, PopcornPopper popcornPopper) {
    this.amplifier = amplifier;
    this.dvdPlayer = dvdPlayer;
    this.cdPlayer = cdPlayer;
    this.projector = projector;
    this.lights = lights;
    this.screen = screen;
    this.popcornPopper = popcornPopper;
}

public void watchMovie(String movieTitle) {
    popcornPopper.turnOn();
    popcornPopper.pop();
    amplifier.turnOn();
    amplifier.setVolume(10);
    lights.turnOn();
    lights.dim(10);
    screen.up();
    dvdPlayer.turnOn();
    dvdPlayer.play();
}

public void endMovie() {
    dvdPlayer.turnOff();
    screen.down();
    lights.turnOff();
    amplifier.turnOff();
}
}

и теперь вместо того, чтобы называть все это, вы можете просто позвонить watchMovie и endMovie методы:

public class HomeTheatherFacadeTest {
    public static void main(String[] args){
        Amplifier amplifier = new Amplifier();
        CdPlayer cdPlayer = new CdPlayer();
        DvdPlayer dvdPlayer = new DvdPlayer();
        Lights lights = new Lights();
        PopcornPopper popcornPopper = new PopcornPopper();
        Projector projector = new Projector();
        Screen screen = new Screen();
        
        HomeTheatherFacade homeTheatherFacade = new HomeTheatherFacade(amplifier, dvdPlayer, cdPlayer, projector, lights, screen, popcornPopper);
        homeTheatherFacade.watchMovie("Home Alone");
        homeTheatherFacade.endMovie();
    }
}

Так:

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

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

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

В основном это система очистки одного окна. Вы назначаете любую работу, которую она делегирует определенному методу в другом классе.

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

Другие вопросы по тегам