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


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

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

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

19 164

19 ответов:

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

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

фасадные щиты пользователь от сложных деталей системы и предоставляет их с 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();
    }
}

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

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

но фасад упростит это и просто предоставит клиенту функцию "watch 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 на счет2, то две подсистемы, которые будут вызваны, снимаются со счета 1 и вносятся на счет2.

with and without facade

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

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

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

Рисунок Фасада : http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

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

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

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

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

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

относительно ваших запросов:

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

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

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

все шаблоны проектирования тоже являются нормальными классами. @ Unmesh Kondolikar правильно ответил на этот вопрос.

можете ли вы объяснить мне об этом Фасад, я новичок в разработке моделей.

согласно Гоф,фасад шаблон дизайна определяется как:

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

The фасад шаблон обычно используется, когда:

  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 подсистемы.

ключевые моменты : ( с journaldev статьи Панкадж Кумар)

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

посмотреть sourcemaking статья тоже для лучшего понимания.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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