Является ли Facade классом, который содержит много других классов?
Что делает его образцом дизайна? Для меня это как обычный класс.
Можете ли вы объяснить мне этот шаблон фасада?
Является ли Facade классом, который содержит много других классов?
Что делает его образцом дизайна? Для меня это как обычный класс.
Можете ли вы объяснить мне этот шаблон фасада?
Шаблон проектирования - это общий способ решения повторяющейся проблемы. Классы во всех шаблонах проектирования - это обычные классы. Важно то, как они структурированы и как они работают вместе, чтобы решить данную проблему наилучшим образом.
Шаблон проектирования Facade упрощает интерфейс к сложной системе; потому что он обычно состоит из всех классов, которые составляют подсистемы сложной системы.
A Facade защищает пользователя от сложных деталей системы и предоставляет simplified view
simplified view
, который равен easy to use
. Он также decouples
код, который использует систему из деталей подсистем, что упрощает модификацию системы позже.
http://www.dofactory.com/Patterns/PatternFacade.aspx
http://www.blackwasp.co.uk/Facade.aspx
Кроме того, что важно при изучении шаблонов проектирования, так это возможность распознавать, какой шаблон соответствует вашей задаче, а затем использовать ее соответствующим образом. Очень часто неправильно использовать шаблон или пытаться подгонять его к какой-то проблеме только потому, что вы это знаете. Помните об этих подводных камнях, изучая\используя шаблоны проектирования.
Wikipedia имеет отличный пример шаблона фасада.
/* 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" - это назначенная функция. Но он включает в себя несколько шагов, например:
Но фасад упростит это и просто предоставит клиенту функцию "смотреть 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");
}
}
Фасад не должен описываться как класс, который содержит много других классов. Это фактически интерфейс к этим классам и должен облегчить использование классов, иначе класс фасада бесполезен.
Шаблон фасада является оболочкой многих других интерфейсов в результате для создания более простого интерфейса.
Шаблоны проектирования полезны, поскольку они решают повторяющиеся проблемы и в целом упрощают код. В команде разработчиков, которые согласны использовать одни и те же шаблоны, это повышает эффективность и понимание при сохранении кода друг друга.
Попробуйте прочитать больше шаблонов:
Фасад: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1
или более широко: http://www.dofactory.com/Patterns/Patterns.aspx
Краткое и простое объяснение:
Попытайтесь понять сценарий с фазами и без них:
Если вы хотите перенести деньги с accout1 на счет2, то две подсистемы, которые будут вызываться, выйдут из учетной записи 1 и внесены на счет2.
Еще одно использование шаблона Façade может заключаться в уменьшении кривой обучения вашей команды. Позвольте мне привести вам пример:
Предположим, что ваше приложение должно взаимодействовать с MS Excel, используя объектную модель COM, предоставленную Excel. Один из членов вашей команды знает все API-интерфейсы Excel, и он создает над ним фасад, который удовлетворяет всем основным сценариям приложения. Никому другому члену команды не нужно тратить время на изучение Excel API. Команда может использовать фасад, не зная внутренних элементов или всех объектов MS Excel, участвующих в выполнении сценария. Разве это не здорово?
Таким образом, он обеспечивает упрощенный и унифицированный интерфейс поверх сложной подсистемы.
Фасад предоставляет упрощенные функции, которые в основном называются, и реализация скрывает сложность, с которой в противном случае клиенты могли бы иметь дело. В целом реализация использует в нем несколько пакетов, классов и функций. Хорошо написанные фасады делают прямой доступ к другим классам редкими. Например, когда я посещаю банкомат и снимаю некоторую сумму. Банкомат скрывает, идет ли он прямо в принадлежащий ему банк или идет по согласованной сети для внешнего банка. Банкомат действует как фасад, потребляющий несколько устройств и подсистем, которые, как клиент, с которыми мне не нужно напрямую обращаться.
Фасад - это класс с уровнем функциональности, который находится между инструментарием и полным приложением, предлагая упрощенное использование классов в пакете или подсистеме. Цель шаблона Facade - предоставить интерфейс, который упрощает использование подсистемы. - Извлечь из book Дизайн шаблонов на С#.
Относительно ваших запросов:
Является ли Facade классом, который содержит много других классов?
Да. Это оболочка для многих подсистем в приложении.
Что делает его образцом дизайна? Для меня это как обычный класс
Все шаблоны проектирования также являются нормальными классами. @Unmesh Kondolikar справедливо ответил на этот запрос.
Можете ли вы объяснить мне об этом Facade, я новичок в разработке шаблонов.
В соответствии с GoF, Фасад шаблон дизайна игнорируется как:
Обеспечить унифицированный интерфейс для набора интерфейсов в подсистеме. Facade Pattern определяет интерфейс более высокого уровня, который упрощает использование подсистемы
Facade шаблон обычно используется, когда:
Возьмем настоящий пример сайта cleartrip.
Этот веб-сайт предоставляет варианты бронирования
Фрагмент кода:
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){
}
}
Пояснение:
FlightBooking, TrainBooking and HotelBooking
- разные подсистемы большой системы: TravelFacade
TravelFacade
предлагает простой интерфейс для бронирования одного из следующих вариантов.
Flight Booking
Train Booking
Hotel Booking
Flight + Hotel booking
Train + Hotel booking
API книги от TravelFacade внутренне вызывает ниже API-интерфейсов подсистем
flightBooking.bookFlight
trainBooking.bookTrain(info);
hotelBooking.bookHotel(info);
Таким образом, TravelFacade
обеспечивает упрощение и упрощение API без использования подсистемных API.
Ключевые вынос: (из journaldev статьи Панкаджа Кумара)
Посмотрите на статью sourcemaking для лучшего понимания.
Фасад обсуждает инкапсуляцию сложной подсистемы внутри одного объекта интерфейса. Это уменьшает кривую обучения, необходимую для успешного использования подсистемы. Это также способствует развязыванию подсистемы от потенциально многих клиентов. С другой стороны, если Facade является единственной точкой доступа для подсистемы, это ограничит возможности и гибкость, которые могут потребоваться "мощным пользователям".
Другой пример фасада: скажем, ваше приложение подключается к базе данных и отображает результаты в пользовательском интерфейсе. Вы можете использовать фасад, чтобы настроить ваше приложение, как при запуске с использованием базы данных или с макетными объектами. Таким образом, вы сделаете все вызовы базы данных в класс фасада, где он будет читать конфигурацию приложения и решают запустить запрос db или вернуть макет. таким образом, приложение становится независимым от db в случае, если db недоступен.
Шаблон проектирования является общим многоразовым решением общей проблемы в данном контексте при разработке программного обеспечения.
Шаблон проектирования Facade является структурным шаблоном, поскольку он определяет способ создания отношений между классами или сущностями. Шаблон проектирования фасада используется для определения упрощенного интерфейса для более сложной подсистемы.
Фасадная структура идеальна при работе с большим количеством взаимозависимых классов или с классами, требующими использования нескольких методов, особенно когда они сложны в использовании или трудны для понимания. Класс фасада - это "обертка", которая содержит набор элементов, которые легко понятны и просты в использовании. Эти члены получают доступ к подсистеме от имени пользователя фасада, скрывая детали реализации.
Шаблон проектирования фасадов особенно полезен при плохой разработке подсистем, но не может быть реорганизован, потому что исходный код недоступен или широко используется существующий интерфейс. Иногда вы можете решить реализовать более одного фасада, чтобы предоставлять подмножества функциональности для разных целей.
Одним из примеров использования шаблона фасада является интеграция веб-сайта с бизнес-приложением. Существующее программное обеспечение может включать в себя большие объемы бизнес-логики, к которым необходимо получить доступ определенным образом. Веб-сайт может потребовать ограниченного доступа к этой бизнес-логике. Например, веб-сайту может потребоваться указать, достиг ли товар для продажи ограниченным уровнем запасов. Метод IsLowStock класса facade может вернуть значение Boolean, чтобы указать это. За кулисами этот метод может скрывать сложности обработки текущего физического запаса, входящего запаса, выделенных предметов и низкого уровня запасов для каждого элемента.
Существует очень хороший пример реальной картины - двигатель стартера автомобиля.
В качестве драйверов мы просто включаем ключ и начинаем работу с автомобилем. Как можно проще. За кулисами задействовано много других автомобильных систем (как аккумулятор, двигатель, топливо и т.д.), Чтобы автомобиль начал успешно, но они скрыты за стартером.
Как вы можете видеть, стартер автомобиля - это Фасад. Это дает нам простой в использовании интерфейс, не беспокоясь о сложности всех других автомобильных систем.
Подведем итог:
Шаблон Facade упрощает и скрывает сложность больших блоков кода или API, обеспечивая более чистый, понятный и простой в использовании интерфейс.
Все шаблоны проектирования - это некоторые классы, которые так или иначе соответствуют конкретному приложению. Цель шаблона фасада - скрыть сложность операции или операций. Вы можете увидеть пример и изучить шаблон фасада из http://preciselyconcise.com/design_patterns/facade.php
Это, в основном, система оформления одного окна. Вы назначаете любую работу, которую он делегирует определенному методу в другом классе.
Вероятно, лучшее объяснение шаблона фасада (и многих других) http://www.jakowicz.com/facade-pattern-in-php/
Шаблон дизайна фасада находится под шаблоном структурного проектирования. Короче говоря, Facade означает внешний вид. Это означает, что в шаблоне проектирования фасадов мы что-то скрываем и показываем только то, что требует клиент. Читать дальше в блоге: http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html
Шаблон фасада обеспечивает унифицированный интерфейс для группы интерфейса подсистемы. Фасад определяет интерфейс высокого уровня, что упрощает работу с подсистемой.