되어 외관 다른 클래스를 많이 포함하는 클래스를?
디자인 패턴은 무엇입니까? 나에게는 일반 수업과 같습니다.
이 Facade 패턴 을 설명해 주 시겠습니까?
되어 외관 다른 클래스를 많이 포함하는 클래스를?
디자인 패턴은 무엇입니까? 나에게는 일반 수업과 같습니다.
이 Facade 패턴 을 설명해 주 시겠습니까?
답변:
디자인 패턴은 반복되는 문제를 해결하는 일반적인 방법입니다. 모든 디자인 패턴의 클래스는 단순한 클래스입니다. 중요한 것은 그들이 어떻게 구성되고 주어진 문제를 가능한 최선의 방법으로 해결하기 위해 협력하는 방법입니다.
외관 디자인 패턴은 복잡한 시스템의 인터페이스를 단순화; 보통 복잡한 시스템의 서브 시스템을 구성하는 모든 클래스로 구성되어 있기 때문입니다.
Facade는 시스템의 복잡한 세부 사항으로부터 사용자를 보호하고 그 중 하나 simplified view
를 제공합니다 easy to use
. 또한 decouples
서브 시스템의 세부 사항에서 시스템을 사용하는 코드이므로 나중에 시스템을 쉽게 수정할 수 있습니다.
http://www.dofactory.com/Patterns/PatternFacade.aspx
http://www.blackwasp.co.uk/Facade.aspx
또한 디자인 패턴을 배우는 동안 중요한 것은 주어진 패턴에 맞는 패턴을 인식하고 적절하게 사용하는 것입니다. 패턴을 잘못 사용하거나 알고 있기 때문에 어떤 문제에 맞추려고하는 것은 매우 일반적인 일입니다. 디자인 패턴을 배우거나 사용하는 동안 이러한 함정에주의하십시오.
Wikipedia 에는 Facade 패턴의 좋은 예가 있습니다.
/* 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();
}
}
Facade는 시스템의 복잡성을 숨기고 클라이언트가 시스템에 액세스 할 수있는 클라이언트에 대한 인터페이스를 제공합니다.
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");
}
}
OrderFacade
있습니까? 귀하의 예에서 사이 Payment
와 Inventory
?
짧고 간단한 설명 :
Façade의 유무에 관계없이 시나리오를 이해하십시오
. 돈을 accout1에서 account2로 송금하려면 호출 할 두 서브 시스템은 account1에서 인출하고 account2로 입금됩니다.
귀하의 질문에 관하여 :
Facade는 다른 많은 클래스를 포함하는 클래스입니까?
예. 응용 프로그램의 많은 하위 시스템에 대한 래퍼입니다.
디자인 패턴은 무엇입니까? 나를 위해, 그것은 일반 수업과 같습니다
모든 디자인 패턴도 일반 클래스입니다. @ Unmesh Kondolikar 는이 질문에 올바르게 대답했습니다.
이 외관에 대해 설명해 주시겠습니까? 저는 패턴을 처음 사용합니다.
GoF에 따르면 Facade 디자인 패턴은 다음과 같이 정의됩니다.
서브 시스템의 인터페이스 세트에 통합 인터페이스를 제공하십시오. Facade Pattern은 서브 시스템을보다 쉽게 사용할 수있게 해주는 상위 인터페이스를 정의합니다.
외관 패턴은 일반적으로 때 사용된다 :
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
TravelFacade의 API 예약은 내부적으로 하위 시스템의 API를 호출합니다.
flightBooking.bookFlight
trainBooking.bookTrain(info);
hotelBooking.bookHotel(info);
이런 식으로, TravelFacade
서브 시스템 API를 노출하지 않고도 더 간단하고 쉬운 API를 제공합니다.
주요 내용 : ( pankaj Kumar의 journaldev 기사 에서 )
더 나은 이해를 위해 소스 제작 기사도 살펴보십시오 .
파사드 패턴은 더 많은 인터페이스를 생성하기 위해 다른 많은 인터페이스의 래퍼입니다.
디자인 패턴은 반복되는 문제를 해결하고 일반적으로 코드를 단순화 할 때 유용합니다. 동일한 패턴을 사용하기로 동의 한 개발자 팀에서는 서로 코드를 유지할 때 효율성과 이해도가 향상됩니다.
더 많은 패턴에 대해 읽으십시오.
외관 패턴 : http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1
또는 더 일반적으로 : http://www.dofactory.com/Patterns/Patterns.aspx
Façade 패턴을 한 번 더 사용하면 팀의 학습 곡선을 줄일 수 있습니다. 예를 들어 보겠습니다.
Excel에서 제공하는 COM 개체 모델을 사용하여 응용 프로그램이 MS Excel과 상호 작용해야한다고 가정합니다. 팀원 중 한 명이 모든 Excel API를 알고 있으며 그 위에 응용 프로그램의 모든 기본 시나리오를 충족하는 Facade를 만듭니다. 팀의 다른 구성원은 Excel API 학습에 시간을 소비 할 필요가 없습니다. 팀은 시나리오를 수행하는 데 관련된 내부 또는 모든 MS Excel 개체를 모른 채 파사드를 사용할 수 있습니다. 대단하지 않습니까?
따라서 복잡한 하위 시스템 위에 단순화되고 통합 된 인터페이스를 제공합니다.
파사드는 대부분 호출되는 단순화 된 기능을 제공하며 구현시 클라이언트가 처리해야하는 복잡성을 숨 깁니다. 일반적으로 구현에는 여러 패키지, 클래스 및 함수가 사용됩니다. 잘 작성된 파사드는 다른 클래스에 직접 액세스하는 것을 거의하지 않습니다. 예를 들어 ATM을 방문하여 금액을 인출 할 때 ATM은 소유 은행으로 바로 갈 것인지 아니면 외부 은행을 위해 협상 된 네트워크를 통과 할 것인지를 숨 깁니다. ATM은 클라이언트로서 직접 처리 할 필요가없는 여러 장치 및 하위 시스템을 소비하는 외관과 같은 역할을합니다.
자동차 스타터 엔진 패턴의 실제 사례가 매우 우수 합니다.
운전자로서 우리는 단지 키를 켜고 자동차가 시동됩니다. 가능한 한 간단합니다. 무대 뒤에서 자동차를 성공적으로 시작하기 위해 많은 다른 자동차 시스템 (배터리, 엔진, 연료 등)이 관여하지만 시동기 뒤에 숨겨져 있습니다.
보시다시피, 자동차 스타터는 외관입니다. 다른 자동차 시스템의 복잡성에 대해 걱정할 필요없이 인터페이스를 쉽게 사용할 수 있습니다.
요약하자 :
Facade 패턴은 대형 코드 블록 또는 API의 복잡성을 단순화하고 숨겨보다 깨끗하고 이해하기 쉽고 사용하기 쉬운 인터페이스를 제공합니다.
Facade는 단일 인터페이스 객체 내에 복잡한 서브 시스템을 캡슐화하는 것에 대해 설명합니다. 이를 통해 서브 시스템을 성공적으로 활용하는 데 필요한 학습 곡선이 줄어 듭니다. 또한 잠재적으로 많은 클라이언트와 서브 시스템의 분리를 촉진합니다. 반면, Facade가 서브 시스템의 유일한 액세스 포인트 인 경우 "파워 유저"가 필요로하는 기능과 유연성이 제한됩니다.
디자인 패턴은 소프트웨어 디자인의 주어진 맥락에서 일반적으로 발생하는 문제에 대한 일반적인 재사용 가능한 솔루션입니다.
Facade 디자인 패턴은 클래스 또는 엔터티 간의 관계를 만드는 방법을 정의하는 구조적 패턴입니다. 파사드 디자인 패턴은보다 복잡한 서브 시스템에 대한 단순화 된 인터페이스를 정의하는 데 사용됩니다.
파사드 패턴은 많은 수의 상호 의존 클래스 또는 여러 메소드를 사용해야하는 클래스, 특히 사용하기가 복잡하거나 이해하기 어려운 클래스에서 작업 할 때 이상적입니다. 파사드 클래스는 이해하기 쉽고 사용하기 쉬운 멤버 집합을 포함하는 "래퍼"입니다. 이 멤버는 파사드 사용자 대신 서브 시스템에 액세스하여 구현 세부 사항을 숨 깁니다.
외관 디자인 패턴은 소스 코드를 사용할 수 없거나 기존 인터페이스가 널리 사용되기 때문에 제대로 설계되지 않았지만 리팩토링 할 수없는 서브 시스템을 래핑 할 때 특히 유용합니다. 때로는 여러 목적을 위해 기능의 서브 세트를 제공하기 위해 둘 이상의 파사드를 구현하기로 결정할 수도 있습니다.
파사드 패턴의 한 가지 사용 예는 웹 사이트를 비즈니스 응용 프로그램과 통합하는 것입니다. 기존 소프트웨어에는 특정 방식으로 액세스해야하는 많은 양의 비즈니스 로직이 포함될 수 있습니다. 웹 사이트는이 비즈니스 로직에 대한 제한된 액세스 만 요구할 수 있습니다. 예를 들어, 웹 사이트는 판매 품목이 제한된 재고 레벨에 도달했는지 여부를 표시해야 할 수 있습니다. 파사드 클래스의 IsLowStock 메서드는이를 나타내는 부울 값을 반환 할 수 있습니다. 배후에서이 방법은 현재 실제 재고, 입고 재고, 할당 된 품목 및 각 품목에 대한 낮은 재고 레벨 처리의 복잡성을 숨길 수 있습니다.
모든 디자인 패턴은 특정 응용 프로그램에 적합한 방식으로 배열 된 클래스입니다. 파사드 패턴의 목적은 작업의 복잡성을 숨기는 것입니다. http://preciselyconcise.com/design_patterns/facade.php 에서 예제를보고 파사드 패턴을 배울 수 있습니다 .
외관 디자인 패턴은 구조 디자인 패턴에 있습니다. 간단히 말하면 Facade는 외관을 의미합니다. Facade 디자인 패턴에서 우리는 무언가를 숨기고 실제로 고객이 요구하는 것만 보여줍니다. 아래 블로그에서 자세한 내용을 확인하십시오 : http://www.sharepointcafe.net/2017/03/facade-design-pattern-in-aspdotnet.html