Sự khác biệt giữa Facade và Adapter Pattern là gì?


Câu trả lời:


142

Các mẫu Facade trang wiki có một lưu ý ngắn gọn về vấn đề này.

"Bộ điều hợp được sử dụng khi trình bao bọc phải tôn trọng một giao diện cụ thể và phải hỗ trợ hành vi đa hình. Mặt khác, một mặt tiền được sử dụng khi người ta muốn một giao diện dễ làm việc hơn hoặc đơn giản hơn."

Tôi đã nghe một phép tương tự mà bạn nên nghĩ đến điều khiển từ xa đa năng mà bạn đã thiết lập để hoạt động với tất cả các hệ thống âm thanh nổi khác nhau của mình - bạn nhấn "bật" và nó sẽ bật hộp cáp, bộ thu và TV của bạn. Có lẽ đó là một rạp hát gia đình thực sự lạ mắt và nó cũng làm mờ đèn và vẽ các sắc thái. Đó là Mặt tiền - một nút / chức năng thực hiện một loạt các bước phức tạp hơn.

Mẫu Bộ điều hợp chỉ liên kết hai giao diện không tương thích.

CHỈNH SỬA: Một sự tương tự nhanh chóng cho mẫu Bộ điều hợp (dựa trên các nhận xét) có thể giống như một bộ chuyển đổi DVI-to-VGA. Các card màn hình hiện đại thường là DVI, nhưng bạn có một màn hình VGA cũ. Với bộ điều hợp cắm vào đầu vào DVI dự kiến ​​của thẻ video và có đầu vào VGA riêng, bạn sẽ có thể làm cho màn hình cũ hoạt động với thẻ video mới.


4
Tương tự tuyệt vời bằng cách sử dụng điều khiển từ xa. Giải thích mẫu bộ điều hợp là OK, nhưng sẽ thật tuyệt nếu đưa ra cùng một loại tương tự.
Kevin Le - Khnle

2
Sự tương tự tuyệt vời thực sự! Một thế giới thực Java ví dụ về mô hình Adaptor có thể giúp đỡ để hiểu nó tốt hơn: InputStreamReaderđó thích nghi InputStreamđể ReaderOutputStreamWriterđó thích nghi OutputStreamđể WriterCả hai là những loại trừu tượng khác nhau.
BalusC

1
@Khnle - Mẫu bộ điều hợp đang hoạt động: upload.wikimedia.org/wikipedia/commons/8/80/…
Eric Petroelje

@Khnle - được thêm vào một phép tương tự Bộ điều hợp (dựa trên kinh nghiệm cá nhân). @Eric - cảm ơn vì nguồn cảm hứng và bức ảnh tuyệt vời! @BalusC - ví dụ tốt về thế giới thực.
awshepard

@BalusC - Tôi cũng thích ví dụ của bạn. May mắn thay, tôi biết Java. @ Eric Petroelje - Một bức tranh đáng giá ngàn lời nói :-) @awshepard - nếu tôi không lập trình, tôi bây giờ có thể theo bạn giải thích quá :-)
Kevin Lê - Khnle

125

Bộ điều hợp == làm cho một chốt vuông vừa vặn với một lỗ tròn.

Mặt tiền == một bảng điều khiển duy nhất để chạy tất cả các thành phần bên trong.


8
Câu trả lời đó đã được hoàn thiện! Tôi bao gồm điều đó trong ghi chú mẫu của tôi. :)
Joshua Dale

1
sự vĩ đại trong sự đơn giản
a-man

20

Thành thật mà nói, nhiều mẫu có thể được triển khai theo cùng một cách lập trình - sự khác biệt nằm ở mục đích.

Mẫu thiết kế Bộ điều hợp có nghĩa là 'dịch' giao diện của một hoặc nhiều lớp thành giao diện mà khách hàng mong đợi sử dụng - bộ điều hợp sẽ dịch các lệnh gọi đến giao diện mong đợi thành giao diện thực tế mà các lớp được bao bọc sử dụng.

Mẫu Mặt tiền được sử dụng khi muốn có một giao diện đơn giản hơn (và một lần nữa, có thể được triển khai theo cách tương tự bằng cách bao bọc các lớp vi phạm.) Bạn sẽ không nói rằng bạn đang sử dụng một mặt tiền khi giao diện hiện tại không tương thích, chỉ khi bạn cần để làm cho nó dễ đọc hơn, ít thiết kế kém hơn, v.v.


18

Mặt tiền:

Những điều quan trọng: (từ bài báo của journaldev của Pankaj Kumar)

  1. Khuôn mặt giống như một trình trợ giúp cho các ứng dụng khách
  2. Khuôn mẫu mặt tiền có thể được áp dụng tại bất kỳ thời điểm phát triển nào, thường là khi số lượng giao diện tăng lên và hệ thống trở nên phức tạp .
  3. Các giao diện hệ thống con không biết về Mặt tiền và chúng sẽ không có bất kỳ tham chiếu nào về giao diện Mặt tiền
  4. Mẫu mặt tiền nên được áp dụng cho các loại giao diện tương tự , mục đích của nó là cung cấp một giao diện duy nhất thay vì nhiều giao diện thực hiện loại công việc tương tự

Sơ đồ lớp mặt tiền:

nhập mô tả hình ảnh ở đây

Bộ chuyển đổi:

  1. Nó là một mô hình cấu trúc
  2. Sẽ rất hữu ích khi làm việc với hai giao diện không tương thích
  3. làm cho mọi thứ hoạt động sau khi chúng được thiết kế

Sơ đồ lớp của Bộ điều hợp:

nhập mô tả hình ảnh ở đây

Bạn có thể tìm thêm chi tiết về Bộ điều hợp trong bài đăng SE này:

Sự khác biệt giữa mẫu Bridge và mẫu Adapter

Sự khác biệt chính:

  1. Facade định nghĩa một giao diện mới, trong khi Adapter sử dụng một giao diện cũ . Bộ điều hợp làm cho hai giao diện hiện có hoạt động cùng nhau thay vì xác định một giao diện hoàn toàn mới
  2. Bộ điều hợp và Mặt tiền đều là trình bao bọc; nhưng chúng là các loại giấy gói khác nhau. Mục đích của Facade là tạo ra một giao diện đơn giản hơn và mục đích của Adapter là thiết kế theo một giao diện hiện có

Có một cái nhìn tại sourcemaking bài viết quá để hiểu rõ hơn.


Thích xem sơ đồ! Tuy nhiên, chỉ cần một số làm rõ, khi tôi thay đổi số lượng / loại thông số có nghĩa là nó không phải là Bộ điều hợp nữa không? như someMethod(int year, int month) đã được giao cho someMethod(DateTime start, DateTime end)hoặc cho phép nói someMethod()giao chosomeMethod(T param)
Jaime Sangcap

Nếu cả hai phương thức nằm trong cùng một lớp, nó được gọi là quá tải. Nếu họ đang ở trong lớp học khác nhau, nó có thể được adpater nếu adapter và adaptee mối quan hệ được thực hiện
Ravindra babu

Giải thích thực sự tốt đẹp.
Đức Filan

14

Một mặt tiền được thiết kế để tổ chức nhiều dịch vụ đằng sau một cổng dịch vụ duy nhất. Bộ điều hợp được thiết kế để cung cấp cách sử dụng một giao diện đã biết để truy cập một giao diện không xác định.


11

Mục đích của một

mặt tiềnsự đơn giản

bộ điều hợpkhả năng tương tác .


8

Mặt tiền thường tương phản với Bộ điều hợp.

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

Như thường lệ, có những điểm tương đồng giữa một số mẫu. Nhưng tôi sẽ thấy nó như thế này:

  • Một mặt tiền được sử dụng để đóng gói toàn bộ một lớp và cung cấp một số phương pháp để truy cập nó một cách "thuận tiện"
  • Một bộ điều hợp được sử dụng, trong đó bạn có hai thành phần lẽ ra đã hoạt động cùng nhau, nhưng không, chỉ vì một số khác biệt "không quan trọng" trong giao diện.

1
Lời giải thích hay. Đây là lần đầu tiên tôi đi qua từ "khác biệt không quan trọng" khi mô tả các bộ chuyển đổi, đó là Infact đúng
Sudara

4

Tôi sẽ cố gắng giải thích điều này bằng những từ ngữ đơn giản, không cần nhiều hình thức.

Hãy tưởng tượng bạn có một số lớp miền và từ giao diện người dùng, bạn muốn tương tác với chúng. Một mặt tiền có thể được sử dụng để cung cấp các chức năng có thể được gọi từ lớp giao diện người dùng để lớp giao diện người dùng không biết về bất kỳ lớp miền nào khác ngoài mặt tiền. Điều đó có nghĩa là thay vì gọi các hàm trong các lớp miền, bạn gọi một hàm duy nhất từ ​​mặt tiền, hàm này sẽ chịu trách nhiệm gọi các hàm cần thiết từ các lớp khác.

Mặt khác, bộ điều hợp có thể được sử dụng để tích hợp các thành phần bên ngoài khác có thể có cùng chức năng mà bạn cần nhưng các chức năng của chúng không được gọi hoàn toàn giống nhau. Giả sử bạn đã có một Carlớp trong miền của mình và bạn làm việc với một nhà cung cấp ô tô bên ngoài cũng có hạng Xe được xác định. Trong lớp này, bạn đã có chức năng car.getDoors()nhưng trình cung cấp bên ngoài có chức năng tương đương car.getNumDoors(). Bạn không muốn thay đổi cách gọi hàm này, vì vậy, bạn có thể sử dụng một lớp bộ điều hợp để bọc lớp Xe bên ngoài để một lệnh gọi tới getDoors()bộ điều hợp được ủy quyền cho getNumDoors()lớp bên ngoài.


3

Mẫu bộ điều hợp cho phép hai giao diện, trước đây không tương thích, hoạt động với nhau. Có 2 giao diện chơi riêng biệt.

Mẫu Mặt tiền lấy một giao diện đã biết, có cấp độ thấp / chi tiết tốt và bao bọc nó bằng giao diện cấp độ / khóa học cao hơn. Có một giao diện duy nhất, đã được đơn giản hóa bằng cách kết hợp với một giao diện khác.


3

Bộ điều hợp làm cho hai giao diện hoạt động cùng nhau.

Mặt tiền hiển thị một lớp duy nhất ở mức cao hơn và hạn chế hơn. Ví dụ, một mặt tiền của mô hình dạng xem chỉ có thể hiển thị các thuộc tính chỉ đọc nhất định của một lớp cấp thấp hơn.


1

Mặt tiền

Tóm tắt độ phức tạp để cung cấp một giao diện đơn giản hơn. Ví dụ, một hệ điều hành máy tính tóm tắt sự phức tạp của phần cứng bên dưới. Hoặc ngôn ngữ lập trình cấp cao (Python / JavaScript) làm giảm độ phức tạp khi so sánh với ngôn ngữ cấp thấp (C).

Bộ chuyển đổi

Nó tương tự như một bộ điều hợp phần cứng. Giả sử bạn muốn kết nối a USB devicevới a serial port, bạn sẽ cần a USB-serial port adapter.


1

Mẫu bộ điều hợp liên kết hai giao diện không tương thích bằng cách cung cấp một giao diện mới.

Mẫu mặt tiền đơn giản hóa một hệ thống con phức tạp (có nhiều thành phần) với một giao diện duy nhất.


1

Sự khác biệt giữa hai mẫu này là rõ ràng, nhưng không phải trong lĩnh vực của Mẫu thiết kế, mà là Mô hình miền. Trong phần sau, tôi sẽ giải thích lý do tại sao.

Đầu tiên, tôi muốn nhắc lại những người khác đã nói ở đây và sau đó tôi sẽ thêm ghi chú:

Mặt tiền là một giao diện cho một hệ thống con (một hệ thống bên ngoài hoặc một hệ thống kế thừa) giúp đơn giản hóa việc truy cập cho khách hàng (chúng tôi). Facade ẩn giao diện của hệ thống con khác (tổng hợp một số lệnh gọi hoặc ẩn một số API mà chúng tôi không cần), do đó, khách hàng của bạn chỉ truy cập hệ thống con đó thông qua Facade này.

Mặt khác, Bộ điều hợp là một trình bao bọc xung quanh một dịch vụ hoặc đối tượng khác. Nó làm cho đối tượng được bọc tuân theo một giao diện tiêu chuẩn mà khách hàng mong đợi. Giả sử có một phương thức trên đối tượng "Sổ cái" mà bạn cần thực hiện một tinh chỉnh (thay đổi các tham số, đổi tên của nó, v.v.). Bạn có thể bọc nó bằng bộ chuyển đổi.

Bây giờ, sự khác biệt vẫn có thể không rõ ràng. Đó là nơi tôi muốn đưa ra sự khác biệt chính giữa hai mẫu này để không có chỗ cho sự nhầm lẫn thêm :

Facade không thay đổi mô hình miền của hệ thống con khác, trong khi Bộ điều hợp thì có. Đây là điểm khác biệt chính. Giai đoạn = Stage.

Đó là lý do tại sao bạn kết hợp hai điều này khi bạn tạo một Lớp chống tham nhũng . Giả sử bạn có hệ thống con mà bạn muốn sử dụng, nhưng bạn không muốn mô hình miền của nó làm xáo trộn mô hình miền của bạn. Bạn sẽ làm gì? Bạn sẽ tạo một Lớp chống tham nhũng. Làm sao? Trước tiên, bạn tạo một Mặt tiền để đơn giản hóa việc truy cập giao diện cho hệ thống con, sau đó là các bộ điều hợp cho các đối tượng miền được sử dụng trong giao diện đó (hãy nhớ rằng mặt tiền vẫn giữ mô hình miền cho hệ thống con khác), vì vậy nó phù hợp với mô hình của bạn.

Nhiều mẫu thiết kế có thể được sử dụng trong mô hình miền. Điều này cũng đúng với các mẫu thiết kế Mặt tiền và Bộ điều hợp. Mặc dù sự khác biệt giữa hai mẫu này có thể không rõ ràng trong lĩnh vực "mẫu thiết kế", nhưng rõ ràng hơn trong lĩnh vực "mô hình hóa miền".


0

Tôi đã đọc cả hai định nghĩa và chúng có vẻ khá giống nhau.

Có thật không ?

Tôi nhận thấy rằng thuật ngữ Bộ điều hợp đôi khi được sử dụng để mô tả những gì trên thực tế là Trạng thái , có thể vì từ này biểu cảm hơn.

Ví dụ, trong Zend Framework , tất cả các lớp Bộ điều hợp trên thực tế là triển khai của mẫu Chiến lược , bởi vì chúng chỉ bọc mã gốc phía sau các lớp, để có một số hành vi.

Bộ điều hợp thường được sử dụng để bọc mã kế thừa hoặc "kiểu cũ".


0

Mục tiêu chính của mẫu Mặt tiền là làm cho lớp hoặc hệ thống con dễ sử dụng hơn, trong khi mục tiêu chính của mẫu Bộ điều hợp là điều chỉnh giao diện theo những gì khách hàng mong đợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.