답변:
외관 패턴 위키 페이지는이에 대한 간단한 메모가 있습니다.
"어댑터는 래퍼가 특정 인터페이스를 존중해야하고 다형성 동작을 지원해야 할 때 사용됩니다. 반면에, 작업하기 더 쉽고 간단한 인터페이스를 원할 때 파사드가 사용됩니다."
모든 다른 스테레오 시스템에서 작동하도록 설정 한 범용 리모컨을 생각해야한다는 비유를 들었습니다. "켜기"를 누르면 케이블 박스, 수신기 및 TV가 켜집니다. 어쩌면 정말 멋진 홈 시어터이고 조명을 어둡게하고 음영도 그려줍니다. 이것이 바로 Facade입니다. 하나의 버튼 / 기능으로 더 복잡한 단계를 처리합니다.
어댑터 패턴은 호환되지 않는 두 인터페이스 만 연결합니다.
편집 : 어댑터 패턴에 대한 빠른 비유 (설명에 따라)는 DVI-to-VGA 어댑터와 비슷할 수 있습니다. 최신 비디오 카드는 종종 DVI이지만 구형 VGA 모니터가 있습니다. 비디오 카드의 예상 DVI 입력에 연결되고 자체 VGA 입력이있는 어댑터를 사용하면 기존 모니터에서 새 비디오 카드를 사용할 수 있습니다.
InputStreamReader
있는 적응 InputStream
에 Reader
와 OutputStreamWriter
적응 OutputStream
에 Writer
다른 추상 종류 모두.
어댑터 == 사각형 못을 둥근 구멍에 맞 춥니 다.
Facade == 모든 내부 구성 요소를 실행하는 단일 제어판.
솔직히 많은 패턴이 프로그래밍 방식으로 동일한 방식으로 구현 될 수 있습니다. 차이점은 의도에 있습니다.
어댑터 디자인 패턴은 하나 이상의 클래스 인터페이스를 클라이언트가 사용할 것으로 예상하는 인터페이스로 '변환'하는 것을 의미합니다. 어댑터는 예상 인터페이스에 대한 호출을 래핑 된 클래스가 사용하는 실제 인터페이스로 변환합니다.
Facade 패턴은 더 간단한 인터페이스를 원할 때 사용됩니다 (다시 말하면 문제가되는 클래스를 래핑하여 동일한 방식으로 구현할 수 있습니다.) 필요한 경우에만 기존 인터페이스가 호환되지 않을 때 Facade를 사용한다고 말하지 않을 것입니다. 가독성을 높이고 디자인이 잘되지 않게 만드는 등
정면:
주요 내용 : ( Pankaj Kumar의 journaldev 기사 에서 )
외관 클래스 다이어그램 :
어댑터:
어댑터 클래스 다이어그램 :
이 SE 게시물에서 어댑터에 대한 자세한 내용을 찾을 수 있습니다.
주요 차이점 :
더 나은 이해를 위해 소스 메이킹 기사도 살펴보십시오 .
someMethod(int year, int month)
에게 위임 된 someMethod(DateTime start, DateTime end)
또는 말할 수 someMethod()
위임someMethod(T param)
목적
외관 은 단순하다
어댑터 는 상호 운용성 입니다.
Facade는 일반적으로 Adapter와 대조됩니다.
+--------------------------------------------------------------+-----------------------------------------------+
| Facade | Adapter |
+--------------------------------------------------------------+-----------------------------------------------+
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface |
| Works with multiple components | Works with single component |
| Control panel is an example | A power adapter is an example |
| High-level interface | Low-level interface |
+--------------------------------------------------------------+-----------------------------------------------+
나는 이것을 별다른 형식없이 평범한 말로 설명하려고 노력할 것이다.
몇 가지 도메인 클래스가 있고 이들과 상호 작용하려는 UI에서 있다고 상상해보십시오. 파사드는 UI 레이어에서 호출 할 수있는 함수를 제공하는 데 사용할 수 있으므로 UI 레이어는 파사드 이외의 도메인 클래스에 대해 알지 못합니다. 즉, 도메인 클래스에서 함수를 호출하는 대신 파사드에서 단일 함수를 호출하면 다른 클래스에서 필요한 함수를 호출 할 책임이 있습니다.
반면에 어댑터는 필요한 기능은 동일하지만 기능이 완전히 동일한 방식으로 호출되지 않는 다른 외부 구성 요소를 통합하는 데 사용할 수 있습니다. Car
도메인에 클래스가 있고 Car 클래스도 정의 된 외부 자동차 제공 업체와 협력 한다고 가정 해 보겠습니다 . 이 클래스에는 함수가 car.getDoors()
있지만 외부 공급자는 이에 상응하는 car.getNumDoors()
. 이 함수를 호출하는 방식을 변경하고 싶지 않으므로 어댑터 클래스를 사용하여 외부 Car 클래스를 래핑 getDoors()
하여 어댑터 호출 getNumDoors()
이 외부 클래스에 위임 되도록 할 수 있습니다 .
어댑터 패턴은 새 인터페이스를 제공하여 호환되지 않는 두 인터페이스를 연결합니다.
파사드 패턴은 단일 인터페이스로 복잡한 하위 시스템 (여러 구성 요소 포함)을 단순화합니다.
이 두 패턴의 차이점은 분명하지만 디자인 패턴 영역이 아니라 도메인 모델링입니다. 다음에서 그 이유를 설명하겠습니다.
먼저 다른 사람들이 여기에서 말한 것을 반복하고 다음 메모를 추가하겠습니다.
Facade는 클라이언트 (미국)의 액세스를 단순화하는 하위 시스템 (외부 또는 레거시 시스템)에 대한 인터페이스입니다. Facade는 다른 하위 시스템의 인터페이스를 숨기므로 (일부 호출을 집계하거나 필요하지 않은 일부 API를 숨 깁니다) 클라이언트는이 Facade를 통해서만 해당 하위 시스템에 액세스합니다.
반면에 어댑터는 다른 서비스 또는 개체를 둘러싼 래퍼입니다. 래핑 된 개체가 클라이언트가 예상하는 표준 인터페이스를 따르도록합니다. "Ledger"개체에 대해 조정 (매개 변수 변경, 이름 변경 등)을 수행해야하는 메서드가 있다고 가정 해 보겠습니다. 어댑터로 감쌀 수 있습니다.
자, 여전히 차이가 명확하지 않을 수 있습니다. 여기에서이 두 패턴의 주요 차이점을 알아 내고 더 이상 혼동 할 여지가 없습니다. .
Facade는 다른 하위 시스템의 도메인 모델을 변경하지 않지만 Adapter는 변경합니다. 이것이 주요 차이점입니다. 기간.
그래서 Anticorruption Layer 를 만들 때이 두 가지를 결합합니다. . 사용하려는 하위 시스템이 있지만 해당 도메인 모델이 도메인 모델을 혼란스럽게하지 않기를 원한다고 가정 해 보겠습니다. 당신은 무엇을 하시겠습니까? 반부패 계층을 만들 것입니다. 어떻게? 먼저 서브 시스템의 인터페이스에 대한 액세스를 단순화하는 Facade를 만든 다음 해당 인터페이스에서 사용되는 도메인 개체에 대한 어댑터를 생성합니다 (파사드는 여전히 다른 서브 시스템의 도메인 모델을 보유하고 있음을 기억하십시오).
도메인 모델링에 많은 디자인 패턴을 사용할 수 있습니다. 이것은 Facade 및 Adapter 디자인 패턴에도 해당됩니다. 이 두 패턴의 차이는 "디자인 패턴"영역에서 명확하지 않을 수 있지만 "도메인 모델링"영역에서는 더 명확합니다.