외관과 어댑터 패턴의 차이점은 무엇입니까?


답변:


142

외관 패턴 위키 페이지는이에 대한 간단한 메모가 있습니다.

"어댑터는 래퍼가 특정 인터페이스를 존중해야하고 다형성 동작을 지원해야 할 때 사용됩니다. 반면에, 작업하기 더 쉽고 간단한 인터페이스를 원할 때 파사드가 사용됩니다."

모든 다른 스테레오 시스템에서 작동하도록 설정 한 범용 리모컨을 생각해야한다는 비유를 들었습니다. "켜기"를 누르면 케이블 박스, 수신기 및 TV가 켜집니다. 어쩌면 정말 멋진 홈 시어터이고 조명을 어둡게하고 음영도 그려줍니다. 이것이 바로 Facade입니다. 하나의 버튼 / 기능으로 더 복잡한 단계를 처리합니다.

어댑터 패턴은 호환되지 않는 두 인터페이스 만 연결합니다.

편집 : 어댑터 패턴에 대한 빠른 비유 (설명에 따라)는 DVI-to-VGA 어댑터와 비슷할 수 있습니다. 최신 비디오 카드는 종종 DVI이지만 구형 VGA 모니터가 있습니다. 비디오 카드의 예상 DVI 입력에 연결되고 자체 VGA 입력이있는 어댑터를 사용하면 기존 모니터에서 새 비디오 카드를 사용할 수 있습니다.


4
리모콘을 사용한 훌륭한 비유. 어댑터 패턴 설명은 괜찮지 만 같은 종류의 비유를 생각해 내면 좋을 것입니다.
Kevin Le-Khnle 2010 년

2
참으로 훌륭한 비유! : 어댑터 패턴의 실제 자바의 예를 더 잘 이해하는 데 도움이 될 수 InputStreamReader있는 적응 InputStreamReaderOutputStreamWriter적응 OutputStreamWriter다른 추상 종류 모두.
BalusC 2010 년

1
@Khnle-작동중인 어댑터 패턴 : upload.wikimedia.org/wikipedia/commons/8/80/…
Eric Petroelje

@Khnle-어댑터 비유에 추가되었습니다 (개인 경험에 기반 함). @Eric-영감과 멋진 사진에 감사드립니다! @BalusC-실제 사례에 대한 좋은 전화.
awshepard 2010 년

@BalusC-나는 당신의 예도 좋아합니다. 다행히 저는 Java를 알고 있습니다. @Eric Petroelje - 한 사진이 천 마디 말의 가치 :-) @awshepard입니다 - 내가 프로그래밍하지 않은 경우, 지금 너무 당신에게 설명을 따를 수 있습니다 :-)
Khnle - 케빈 르

125

어댑터 == 사각형 못을 둥근 구멍에 맞 춥니 다.

Facade == 모든 내부 구성 요소를 실행하는 단일 제어판.


8
그 대답은 완벽하게 벙어리입니다! 나는 그것을 나의 패턴 노트에 포함시키고있다. :)
Joshua Dale

1
단순 위대함
A-사람

20

솔직히 많은 패턴이 프로그래밍 방식으로 동일한 방식으로 구현 될 수 있습니다. 차이점은 의도에 있습니다.

어댑터 디자인 패턴은 하나 이상의 클래스 인터페이스를 클라이언트가 사용할 것으로 예상하는 인터페이스로 '변환'하는 것을 의미합니다. 어댑터는 예상 인터페이스에 대한 호출을 래핑 된 클래스가 사용하는 실제 인터페이스로 변환합니다.

Facade 패턴은 더 간단한 인터페이스를 원할 때 사용됩니다 (다시 말하면 문제가되는 클래스를 래핑하여 동일한 방식으로 구현할 수 있습니다.) 필요한 경우에만 기존 인터페이스가 호환되지 않을 때 Facade를 사용한다고 말하지 않을 것입니다. 가독성을 높이고 디자인이 잘되지 않게 만드는 등


18

정면:

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

  1. Facade 패턴은 클라이언트 애플리케이션 의 도우미 와 비슷 합니다.
  2. Facade 패턴은 일반적으로 인터페이스 수가 증가하고 시스템이 복잡해질 때 개발의 어느 시점에서나 적용 할 수 있습니다 .
  3. 하위 시스템 인터페이스는 Facade를 인식 하지 않으며 Facade 인터페이스에 대한 참조가 없어야합니다.
  4. 유사한 종류의 인터페이스에 Facade 패턴을 적용해야합니다 . 그 목적은 유사한 종류의 작업을 수행하는 여러 인터페이스가 아닌 단일 인터페이스를 제공하는 것입니다.

외관 클래스 다이어그램 :

여기에 이미지 설명 입력

어댑터:

  1. 그것은 인 구조 패턴
  2. 두 개의 호환되지 않는 인터페이스 로 작업하는 것이 유용합니다.
  3. 그것은 사물의 일을하게 그들이 설계하고 후

어댑터 클래스 다이어그램 :

여기에 이미지 설명 입력

이 SE 게시물에서 어댑터에 대한 자세한 내용을 찾을 수 있습니다.

브리지 패턴과 어댑터 패턴의 차이점

주요 차이점 :

  1. Facade는 새 인터페이스를 정의하는 반면 Adapter는 이전 인터페이스를 사용합니다 . 어댑터는 완전히 새로운 인터페이스를 정의하는 대신 기존 인터페이스 두 개를 함께 작동하도록합니다.
  2. Adapter와 Facade는 둘 다 래퍼입니다. 그러나 그들은 다른 종류의 래퍼입니다. Facade의 목적은 더 간단한 인터페이스를 생성하는 것이고, Adapter의 목적은 기존 인터페이스를 설계하는 것입니다.

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


다이어그램을보고 싶어요! 그러나 매개 변수의 수 / 유형을 변경하면 더 이상 어댑터가 아님을 의미합니까? 등 someMethod(int year, int month) 에게 위임 된 someMethod(DateTime start, DateTime end)또는 말할 수 someMethod()위임someMethod(T param)
제이미 Sangcap

두 메서드가 같은 클래스에 있으면이를 오버로딩이라고합니다. 서로 다른 클래스에있는 경우 어댑터와 그 Adaptee 관계가 구현된다면, 그것은 adpater 수 있습니다
라빈 드라 BABU를

정말 좋은 설명입니다.
Duc Filan 2017 년

14

Facade는 단일 서비스 게이트웨이 뒤에 여러 서비스를 구성하도록 설계되었습니다. 어댑터는 알려진 인터페이스를 사용하여 알 수없는 인터페이스에 액세스하는 방법을 제공하도록 설계되었습니다.



8

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                           |
+--------------------------------------------------------------+-----------------------------------------------+

4

평소와 같이 여러 패턴간에 유사점이 있습니다. 하지만 다음과 같이 볼 수 있습니다.

  • 파사드는 전체 레이어를 캡슐화하는 데 사용되며 "편리하게"액세스 할 수있는 몇 가지 방법을 제공합니다.
  • 인터페이스의 "중요하지 않은"차이 때문에 이미 함께 작동해야하지만 작동하지 않는 두 구성 요소가있는 어댑터가 사용됩니다.

1
좋은 설명입니다. 어댑터를 설명 할 때 "중요하지 않은 차이점"이라는 단어를 처음
접한

4

나는 이것을 별다른 형식없이 평범한 말로 설명하려고 노력할 것이다.

몇 가지 도메인 클래스가 있고 이들과 상호 작용하려는 UI에서 있다고 상상해보십시오. 파사드는 UI 레이어에서 호출 할 수있는 함수를 제공하는 데 사용할 수 있으므로 UI ​​레이어는 파사드 이외의 도메인 클래스에 대해 알지 못합니다. 즉, 도메인 클래스에서 함수를 호출하는 대신 파사드에서 단일 함수를 호출하면 다른 클래스에서 필요한 함수를 호출 할 책임이 있습니다.

반면에 어댑터는 필요한 기능은 동일하지만 기능이 완전히 동일한 방식으로 호출되지 않는 다른 외부 구성 요소를 통합하는 데 사용할 수 있습니다. Car도메인에 클래스가 있고 Car 클래스도 정의 된 외부 자동차 제공 업체와 협력 한다고 가정 해 보겠습니다 . 이 클래스에는 함수가 car.getDoors()있지만 외부 공급자는 이에 상응하는 car.getNumDoors(). 이 함수를 호출하는 방식을 변경하고 싶지 않으므로 어댑터 클래스를 사용하여 외부 Car 클래스를 래핑 getDoors()하여 어댑터 호출 getNumDoors()이 외부 클래스에 위임 되도록 할 수 있습니다 .


3

어댑터 패턴을 사용하면 이전에 호환되지 않았던 두 개의 인터페이스가 서로 작동 할 수 있습니다. 2 개의 별도 인터페이스가 있습니다.

Facade 패턴은 알려진 인터페이스, 즉 로우 레벨 / 미세 그레인을 취하여 더 높은 레벨 / 코스 그레인 인터페이스로 래핑합니다. 단일 인터페이스가 있으며 다른 인터페이스로 래핑하여 단순화되었습니다.


3

어댑터는 두 개의 인터페이스가 함께 작동하도록합니다.

Facade는 단일 클래스를 더 높고 더 제한된 수준에 노출합니다. 예를 들어 뷰 모델 파사드는 하위 수준 클래스의 특정 읽기 전용 속성 만 노출 할 수 있습니다.


1

정면

복잡성을 추상화하여 더 간단한 인터페이스를 제공합니다. 예를 들어 컴퓨터 OS는 기본 하드웨어의 복잡성을 추상화합니다. 또는 고수준 프로그래밍 언어 (Python / JavaScript)는 저수준 언어 (C)와 비교할 때 복잡성을 추상화합니다.

어댑터

하드웨어 어댑터와 유사합니다. 당신이 연결하고 싶은 말은 USB deviceA를 serial port, 당신이 필요합니다 USB-serial port adapter.


1

어댑터 패턴은 새 인터페이스를 제공하여 호환되지 않는 두 인터페이스를 연결합니다.

파사드 패턴은 단일 인터페이스로 복잡한 하위 시스템 (여러 구성 요소 포함)을 단순화합니다.


1

이 두 패턴의 차이점은 분명하지만 디자인 패턴 영역이 아니라 도메인 모델링입니다. 다음에서 그 이유를 설명하겠습니다.

먼저 다른 사람들이 여기에서 말한 것을 반복하고 다음 메모를 추가하겠습니다.

Facade는 클라이언트 (미국)의 액세스를 단순화하는 하위 시스템 (외부 또는 레거시 시스템)에 대한 인터페이스입니다. Facade는 다른 하위 시스템의 인터페이스를 숨기므로 (일부 호출을 집계하거나 필요하지 않은 일부 API를 숨 깁니다) 클라이언트는이 Facade를 통해서만 해당 하위 시스템에 액세스합니다.

반면에 어댑터는 다른 서비스 또는 개체를 둘러싼 래퍼입니다. 래핑 된 개체가 클라이언트가 예상하는 표준 인터페이스를 따르도록합니다. "Ledger"개체에 대해 조정 (매개 변수 변경, 이름 변경 등)을 수행해야하는 메서드가 있다고 가정 해 보겠습니다. 어댑터로 감쌀 수 있습니다.

자, 여전히 차이가 명확하지 않을 수 있습니다. 여기에서이 두 패턴의 주요 차이점을 알아 내고 더 이상 혼동 할 여지가 없습니다. .

Facade는 다른 하위 시스템의 도메인 모델을 변경하지 않지만 Adapter는 변경합니다. 이것이 주요 차이점입니다. 기간.

그래서 Anticorruption Layer 를 만들 때이 두 가지를 결합합니다. . 사용하려는 하위 시스템이 있지만 해당 도메인 모델이 도메인 모델을 혼란스럽게하지 않기를 원한다고 가정 해 보겠습니다. 당신은 무엇을 하시겠습니까? 반부패 계층을 만들 것입니다. 어떻게? 먼저 서브 시스템의 인터페이스에 대한 액세스를 단순화하는 Facade를 만든 다음 해당 인터페이스에서 사용되는 도메인 개체에 대한 어댑터를 생성합니다 (파사드는 여전히 다른 서브 시스템의 도메인 모델을 보유하고 있음을 기억하십시오).

도메인 모델링에 많은 디자인 패턴을 사용할 수 있습니다. 이것은 Facade 및 Adapter 디자인 패턴에도 해당됩니다. 이 두 패턴의 차이는 "디자인 패턴"영역에서 명확하지 않을 수 있지만 "도메인 모델링"영역에서는 더 명확합니다.


0

나는 두 정의를 모두 읽고 있었고 그것들은 상당히 똑같이 보입니다.

정말 ?

어댑터 라는 용어 가 실제로 Stategy 를 설명하는 데 사용되는 경우가 있습니다. 라는 단어 가 있습니다.

예를 들어 Zend Framework 에서 모든 Adapter 클래스는 실제로 Strategy 패턴의 클래스 뒤에 네이티브 코드 만 래핑하여 여러 동작을 갖기 때문입니다.

어댑터는 종종 레거시 또는 "이전 스타일"코드를 래핑하는 데 사용됩니다.


0

Facade 패턴 의 주요 목표는 클래스 또는 하위 시스템을 더 쉽게 사용할 수 있도록하는 반면 어댑터 패턴 의 주요 목표 는 클라이언트가 기대하는 인터페이스를 조정하는 것입니다.

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