정면 디자인 패턴은 무엇입니까?


191

되어 외관 다른 클래스를 많이 포함하는 클래스를?

디자인 패턴은 무엇입니까? 나에게는 일반 수업과 같습니다.

Facade 패턴 을 설명해 주 시겠습니까?


7
모든 디자인 패턴은 구현에서 많은 클래스입니다.
Felix Kling

1
Façade 패턴은 한 클래스에서 여러 인터페이스를 숨겨 인터페이스를 사용하기 쉽게 만듭니다. 이 기사에는 자세한 내용이 있습니다.
user3199690

이 게시물에서 잘 설명 programmerzdojo.com/java-tutorials/…
rishi007bansod

"연구 노력을 보여주지 않기"때문에 이것을 거절했습니다
Roy Truelove

1
@RoyTruelove, 당신이 원하는 것을하십시오. 질문에 대한지지가있는 한 신경 쓰지 않습니다. 질문에 대한 지원 답변이 있습니까?
kevin

답변:


190

디자인 패턴은 반복되는 문제를 해결하는 일반적인 방법입니다. 모든 디자인 패턴의 클래스는 단순한 클래스입니다. 중요한 것은 그들이 어떻게 구성되고 주어진 문제를 가능한 최선의 방법으로 해결하기 위해 협력하는 방법입니다.

외관 디자인 패턴은 복잡한 시스템의 인터페이스를 단순화; 보통 복잡한 시스템의 서브 시스템을 구성하는 모든 클래스로 구성되어 있기 때문입니다.

Facade는 시스템의 복잡한 세부 사항으로부터 사용자를 보호하고 그 중 하나 simplified view를 제공합니다 easy to use. 또한 decouples서브 시스템의 세부 사항에서 시스템을 사용하는 코드이므로 나중에 시스템을 쉽게 수정할 수 있습니다.

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

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

또한 디자인 패턴을 배우는 동안 중요한 것은 주어진 패턴에 맞는 패턴을 인식하고 적절하게 사용하는 것입니다. 패턴을 잘못 사용하거나 알고 있기 때문에 어떤 문제에 맞추려고하는 것은 매우 일반적인 일입니다. 디자인 패턴을 배우거나 사용하는 동안 이러한 함정에주의하십시오.


9
@ kevin : 그것들을 언제 사용하는지 아는 것이 가장 어려운 부분입니다. 이론적으로 패턴은 쉽지만 실제로는 어렵다. 이 경험 만 배울 수 있습니다. 코딩, 코딩, 코딩.
펠릭스 클링

외관 디자인 패턴은 디테일 클래스의 구현을 숨기고 공개 API를 안전하게 제공하는데도 사용됩니다.
yebw

29
jquery에서 $는 단순한 인터페이스를 제공하고 모든 복잡성을 숨기는 정면 디자인 패턴의 간단한
예일뿐입니다

실제 사례와 함께 외관 디자인 패턴을 찾는 사람에게 적합합니다. 나는이 짧은 유투브 tutuorial를 만났다. 유용한 youtu.be/dLjJo2v2re8
Sankar ganesh

응용 프로그램이 커질 때 단일 시스템에 둘 이상의 파사드 레이어를 가질 수 있습니까?
Jeeva Jsb

100

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

6
이것은 좋은 예입니다. 고객이 원하는 경우 외관의 모든 단계를 함께 구성 할 수 있어야합니다. 개인 방법으로는 아무것도 숨길 수 없습니다.
Rob

2
사용 사례를 강조하지 않기 때문에 좋은 예는 아닙니다. TO가 말했듯이 예제는 일반 클래스를 보여줍니다. 하드웨어와의 연관성은 구성입니다. 위키의 예제에서는 과잉 일 수도 있지만 서브 모듈을 설정하는 대신 의존성 주입을 사용하면 의도를 강조하고 TO의 혼동을 피할 수 있습니다.
ManuelSchneid3r 2016 년

이것은 개념 자체를 이해하기 위해 간단히 수천 단어를 감싸는 놀라운 예입니다. 나머지는 다른 시나리오에 대한 세부 사항 일뿐입니다 (물론 디자인 패턴으로 모든 시나리오를 다룰 수는 없습니다).
Syed

41

이전 답변에서 설명했듯이 소비 클라이언트에게 간단한 인터페이스를 제공합니다. 예를 들어 "watch ESPN"은 의도 된 기능입니다. 그러나 다음과 같은 여러 단계가 포함됩니다.

  1. 필요한 경우 TV를 켜십시오.
  2. 위성 / 케이블 기능을 점검하십시오.
  3. 필요한 경우 ESPN으로 전환하십시오.

그러나 파사드는이를 단순화하고 클라이언트에게 "watch ESPN"기능을 제공합니다.


29

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있습니까? 귀하의 예에서 사이 PaymentInventory?
Isuru

19

짧고 간단한 설명 :

  • Facade 패턴은 서브 시스템의 인터페이스 세트에 대한 통합 인터페이스를 제공합니다.
  • Facade는 서브 시스템을보다 쉽게 ​​사용할 수있는 상위 레벨 인터페이스를 정의합니다.

Façade의 유무에 관계없이 시나리오를 이해하십시오
. 돈을 accout1에서 account2로 송금하려면 호출 할 두 서브 시스템은 account1에서 인출하고 account2로 입금됩니다.

정면의 유무에 관계없이


간단하고 명확한 설명과 예, 감사합니다! 서브 시스템을 정의하는 내용도 설명해 주시겠습니까? 서브 시스템이 상대적으로 관련이없는 서브 클래스 / 함수로 구성 될 수 있으면 정의는 거의 모든 클래스에 적용됩니다. 서브 시스템의 클래스가 외관이나 외관을 호출 할 수 있도록 모듈이나 라이브러리와 같이 밀접하게 관련되어 있어야합니까?
Benni

@Benni 예, 서브 시스템 (클래스 일 것입니다)은 상대적으로 관련없는 함수로 구성 될 수 있지만 파사드는 호출 할 특정 함수를 결정하는 클래스입니다. "투어 패키지"를 예약하고 싶을 때는 호텔, 택시, 비행기를 한 곳 / 양식에서 선택한 다음 내부에서 파사드가 다른 적절한 클래스의 기능을 호출하고 최종 결과를 반환합니다. 그렇지 않습니까?
Arun Raaj

10

정면은 많은 다른 클래스를 포함하는 클래스로 설명되어서는 안됩니다. 실제로이 클래스에 대한 인터페이스이며 클래스 사용을 더 쉽게해야합니다. 그렇지 않으면 파사드 클래스가 쓸모가 없습니다.


7

귀하의 질문에 관하여 :

Facade는 다른 많은 클래스를 포함하는 클래스입니까?

예. 응용 프로그램의 많은 하위 시스템에 대한 래퍼입니다.

디자인 패턴은 무엇입니까? 나를 위해, 그것은 일반 수업과 같습니다

모든 디자인 패턴도 일반 클래스입니다. @ Unmesh Kondolikar 는이 질문에 올바르게 대답했습니다.

이 외관에 대해 설명해 주시겠습니까? 저는 패턴을 처음 사용합니다.

GoF에 따르면 Facade 디자인 패턴은 다음과 같이 정의됩니다.

서브 시스템의 인터페이스 세트에 통합 인터페이스를 제공하십시오. Facade Pattern은 서브 시스템을보다 쉽게 ​​사용할 수있게 해주는 상위 인터페이스를 정의합니다.

외관 패턴은 일반적으로 때 사용된다 :

  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. TravelFacade의 API 예약은 내부적으로 하위 시스템의 API를 호출합니다.

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. 이런 식으로, TravelFacade서브 시스템 API를 노출하지 않고도 더 간단하고 쉬운 API를 제공합니다.

주요 내용 : ( pankaj Kumar의 journaldev 기사 에서 )

  1. 외관 패턴은 클라이언트 응용 프로그램 의 도우미 와 비슷 합니다.
  2. 외관 패턴은 개발 시점에 적용 할 수 있으며, 일반적으로 인터페이스 수가 늘어나고 시스템이 완성 될 때 x .
  3. 서브 시스템 인터페이스는 Facade를 인식 하지 않으며 Facade 인터페이스에 대한 참조가 없어야합니다.
  4. 외관 패턴은 유사한 종류의 인터페이스에 적용되어야하며 , 그 목적은 유사한 종류의 작업을 수행하는 여러 인터페이스가 아닌 단일 인터페이스를 제공하는 것입니다.

더 나은 이해를 위해 소스 제작 기사도 살펴보십시오 .


6

파사드 패턴은 더 많은 인터페이스를 생성하기 위해 다른 많은 인터페이스의 래퍼입니다.

디자인 패턴은 반복되는 문제를 해결하고 일반적으로 코드를 단순화 할 때 유용합니다. 동일한 패턴을 사용하기로 동의 한 개발자 팀에서는 서로 코드를 유지할 때 효율성과 이해도가 향상됩니다.

더 많은 패턴에 대해 읽으십시오.

외관 패턴 : http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

또는 더 일반적으로 : http://www.dofactory.com/Patterns/Patterns.aspx


nileshgule.com/2012/07/facade-design-pattern.html 여기에서 주택 대출 확인 프로세스의 예와 함께 Facade 디자인 패턴을 설명하려고했습니다.
Nilesh Gule

6

Façade 패턴을 한 번 더 사용하면 팀의 학습 곡선을 줄일 수 있습니다. 예를 들어 보겠습니다.

Excel에서 제공하는 COM 개체 모델을 사용하여 응용 프로그램이 MS Excel과 상호 작용해야한다고 가정합니다. 팀원 중 한 명이 모든 Excel API를 알고 있으며 그 위에 응용 프로그램의 모든 기본 시나리오를 충족하는 Facade를 만듭니다. 팀의 다른 구성원은 Excel API 학습에 시간을 소비 할 필요가 없습니다. 팀은 시나리오를 수행하는 데 관련된 내부 또는 모든 MS Excel 개체를 모른 채 파사드를 사용할 수 있습니다. 대단하지 않습니까?

따라서 복잡한 하위 시스템 위에 단순화되고 통합 된 인터페이스를 제공합니다.


5

외관의 또 다른 예 : 응용 프로그램이 데이터베이스에 연결되어 UI에 결과를 표시한다고 가정 해보십시오. 파사드를 사용하여 데이터베이스 또는 모의 객체를 사용하여 실행하는 것처럼 응용 프로그램을 구성 할 수 있습니다. 따라서 파사드 클래스에 대한 모든 데이터베이스 호출을 수행하면 app config를 읽고 db 쿼리를 실행하거나 모의 객체를 반환하기로 결정합니다. 이 방법으로 db를 사용할 수없는 경우 응용 프로그램이 db와 독립적이됩니다.


5

파사드는 대부분 호출되는 단순화 된 기능을 제공하며 구현시 클라이언트가 처리해야하는 복잡성을 숨 깁니다. 일반적으로 구현에는 여러 패키지, 클래스 및 함수가 사용됩니다. 잘 작성된 파사드는 다른 클래스에 직접 액세스하는 것을 거의하지 않습니다. 예를 들어 ATM을 방문하여 금액을 인출 할 때 ATM은 소유 은행으로 바로 갈 것인지 아니면 외부 은행을 위해 협상 된 네트워크를 통과 할 것인지를 숨 깁니다. ATM은 클라이언트로서 직접 처리 할 필요가없는 여러 장치 및 하위 시스템을 소비하는 외관과 같은 역할을합니다.


5

자동차 스타터 엔진 패턴의 실제 사례가 매우 우수 합니다.

운전자로서 우리는 단지 키를 켜고 자동차가 시동됩니다. 가능한 한 간단합니다. 무대 뒤에서 자동차를 성공적으로 시작하기 위해 많은 다른 자동차 시스템 (배터리, 엔진, 연료 등)이 관여하지만 시동기 뒤에 숨겨져 있습니다.

보시다시피, 자동차 스타터는 외관입니다. 다른 자동차 시스템의 복잡성에 대해 걱정할 필요없이 인터페이스를 쉽게 사용할 수 있습니다.

요약하자 :

Facade 패턴은 대형 코드 블록 또는 API의 복잡성을 단순화하고 숨겨보다 깨끗하고 이해하기 쉽고 사용하기 쉬운 인터페이스를 제공합니다.


4

파사드는 패키지 또는 서브 시스템에서 클래스의 단순화 된 사용법을 제공하는 툴킷과 완전한 애플리케이션 사이에있는 기능 레벨의 클래스입니다. Facade 패턴의 목적은 서브 시스템을 쉽게 사용할 수있는 인터페이스를 제공하는 것입니다. -C #의 디자인 패턴에서 추출하십시오 .


4

Facade는 단일 인터페이스 객체 내에 복잡한 서브 시스템을 캡슐화하는 것에 대해 설명합니다. 이를 통해 서브 시스템을 성공적으로 활용하는 데 필요한 학습 곡선이 줄어 듭니다. 또한 잠재적으로 많은 클라이언트와 서브 시스템의 분리를 촉진합니다. 반면, Facade가 서브 시스템의 유일한 액세스 포인트 인 경우 "파워 유저"가 필요로하는 기능과 유연성이 제한됩니다.

출처 : https://sourcemaking.com/design_patterns/facade


3

디자인 패턴은 소프트웨어 디자인의 주어진 맥락에서 일반적으로 발생하는 문제에 대한 일반적인 재사용 가능한 솔루션입니다.

Facade 디자인 패턴은 클래스 또는 엔터티 간의 관계를 만드는 방법을 정의하는 구조적 패턴입니다. 파사드 디자인 패턴은보다 복잡한 서브 시스템에 대한 단순화 된 인터페이스를 정의하는 데 사용됩니다.

파사드 패턴은 많은 수의 상호 의존 클래스 또는 여러 메소드를 사용해야하는 클래스, 특히 사용하기가 복잡하거나 이해하기 어려운 클래스에서 작업 할 때 이상적입니다. 파사드 클래스는 이해하기 쉽고 사용하기 쉬운 멤버 집합을 포함하는 "래퍼"입니다. 이 멤버는 파사드 사용자 대신 서브 시스템에 액세스하여 구현 세부 사항을 숨 깁니다.

외관 디자인 패턴은 소스 코드를 사용할 수 없거나 기존 인터페이스가 널리 사용되기 때문에 제대로 설계되지 않았지만 리팩토링 할 수없는 서브 시스템을 래핑 할 때 특히 유용합니다. 때로는 여러 목적을 위해 기능의 서브 세트를 제공하기 위해 둘 이상의 파사드를 구현하기로 결정할 수도 있습니다.

파사드 패턴의 한 가지 사용 예는 웹 사이트를 비즈니스 응용 프로그램과 통합하는 것입니다. 기존 소프트웨어에는 특정 방식으로 액세스해야하는 많은 양의 비즈니스 로직이 포함될 수 있습니다. 웹 사이트는이 비즈니스 로직에 대한 제한된 액세스 만 요구할 수 있습니다. 예를 들어, 웹 사이트는 판매 품목이 제한된 재고 레벨에 도달했는지 여부를 표시해야 할 수 있습니다. 파사드 클래스의 IsLowStock 메서드는이를 나타내는 부울 값을 반환 할 수 있습니다. 배후에서이 방법은 현재 실제 재고, 입고 재고, 할당 된 품목 및 각 품목에 대한 낮은 재고 레벨 처리의 복잡성을 숨길 수 있습니다.



2

단순히 여러 메소드를 호출하는 랩퍼를 작성합니다. 메소드 x () 및 y ()를 가진 A 클래스와 메소드 k () 및 z ()를 가진 B 클래스가 있습니다. x, y, z를 한 번에 호출하려면 Facade 패턴을 사용하여 Facade 클래스를 만들고 xyz ()라고하는 메소드를 만듭니다. 각 메소드 (x, y 및 z)를 개별적으로 호출하는 대신 파사드 클래스의 래퍼 메소드 (xyz ())를 호출하면 해당 메소드를 호출합니다.

비슷한 패턴은 저장소이지만 주로 데이터 액세스 계층에 사용됩니다.


1

기본적으로 단일 창 정리 시스템입니다. 다른 클래스의 특정 메소드에 위임 할 작업을 지정합니다.



1

파사드 패턴은 서브 시스템 인터페이스 그룹에 통합 된 인터페이스를 제공합니다. 파사드는 하위 수준의 작업을 단순화하는 고급 인터페이스를 정의합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.