Что такое шаблон оформления фасада? - PullRequest
179 голосов
/ 09 марта 2011

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

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

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

Ответы [ 20 ]

178 голосов
/ 09 марта 2011

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

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

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

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

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

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

91 голосов
/ 05 сентября 2013

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

/* 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();
    }
}
40 голосов
/ 09 марта 2011

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

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

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

28 голосов
/ 14 декабря 2013

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

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");
       }
  }
15 голосов
/ 04 апреля 2018

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

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

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

with and without facade

10 голосов
/ 09 марта 2011

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

7 голосов
/ 08 марта 2016

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

Является ли 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 подсистем.

Ключевые выносы: (из journaldev статья Pankaj Kumar )

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

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

6 голосов
/ 09 марта 2011

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

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

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

Фасад: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

или более обычно: http://www.dofactory.com/Patterns/Patterns.aspx

6 голосов
/ 16 марта 2011

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

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

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

5 голосов
/ 26 марта 2013

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

...