2010-06-02 11 views

Trả lời

86

Trang wiki Facade Pattern có ghi chú ngắn gọn về điều này.

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

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

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

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

+3

Tương tự tuyệt vời khi sử dụng điều khiển từ xa. Lời giải thích mẫu bộ điều hợp là OK, nhưng nó sẽ là tuyệt vời để đến với cùng một loại tương tự. –

+2

Tương tự tuyệt vời thực sự! Một ví dụ Java thế giới thực của mẫu Adapter có thể giúp hiểu nó tốt hơn: ['InputStreamReader'] (http://java.sun.com/javase/6/docs/api/java/io/InputStreamReader.html) điều chỉnh' InputStream' thành 'Reader' và [' OutputStreamWriter'] (http://java.sun.com/javase/6/docs/api/java/io/OutputStreamWriter.html) điều chỉnh 'OutputStream' thành' Writer' Cả hai là các loại trừu tượng khác nhau. – BalusC

+1

@Khnle - Mô hình bộ điều hợp đang hoạt động: http://upload.wikimedia.org/wikipedia/commons/8/80/USB_PS2_Adapters.JPG –

7

Mặt tiền được thiết kế để tổ chức nhiều dịch vụ phía sau một cổng dịch vụ duy nhất. Một adapter được thiết kế để cung cấp một 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.

2

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

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

2

Bộ chuyển đổi làm cho hai giao diện hoạt động cùng nhau.

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

3

Như thường lệ, có sự giống nhau giữa một số mẫu. Nhưng tôi sẽ nhìn 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 vào nó "thuận tiện"
  • Một adapter được sử dụng, nơi bạn có hai thành phần đó nên đã làm việc 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.
+0

Giải thích tốt. Đây là lần đầu tiên tôi bắt gặp từ "sự khác biệt không quan trọng" khi mô tả bộ điều hợp, điều này là đúng sự thật – Sudara

78

Bộ chuyển đổi == tạo hình vuông có khớp với một lỗ tròn.

Facade == 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.

+2

Câu trả lời đó bị dập tắt để hoàn thiện! Tôi bao gồm điều đó trong ghi chú mẫu của tôi. :) –

+0

sự vĩ đại trong sự đơn giản –

15

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

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à máy khách mong muốn sử dụng - bộ điều hợp sẽ chuyển các cuộc gọi đến giao diện dự kiến ​​sang giao diện thực tế .

Mẫu mặt tiền được sử dụng khi giao diện đơn giản hơn được mong muốn (và một lần nữa, có thể được triển khai theo cách tương tự bằng cách gói các lớp vi phạm.) Bạn sẽ không nói bạn đang sử dụng 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 được thiết kế kém hơn, v.v.

3

Tôi sẽ cố giải thích điều này bằng những từ đơn giản, không có 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 mà bạn muốn tương tác với chúng. Mặt tiền có thể được sử dụng để cung cấp các hàm 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 mà bạn gọi một hàm duy nhất từ ​​mặt tiền, nó sẽ chịu trách nhiệm gọi các hàm cần thiết từ các lớp khác.

Bộ điều hợp, mặt khác, 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 bạn cần nhưng chức năng của chúng không được gọi tương tự. Giả sử bạn có một lớp học Car trong miền của bạn và bạn làm việc với nhà cung cấp xe hơi bên ngoài có lớp Xe được xác định là tốt. Trong lớp này, bạn có chức năng car.getDoors() nhưng nhà cung cấp bên ngoài có số car.getNumDoors() tương đương. Bạn không muốn thay đổi cách bạn gọi hàm này, vì vậy bạn có thể sử dụng lớp bộ điều hợp để bọc lớp Ô tô ngoài để cuộc gọi đến getDoors() của bộ điều hợp được giao cho getNumDoors() của lớp bên ngoài.

0

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

Thật sao?

tôi đã nhận thấy rằng thuật ngữ Adaptor đôi khi được dùng để mô tả những gì có trong thực tế, một stategy, có lẽ vì từ là biểu cảm hơn.

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

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

6

Facade:

takeaways chính: (từ journaldev bài viết của Pankaj Kumar)

  1. Facade pattern là giống như một helper cho các ứng dụng client
  2. mẫu mặt tiền có thể được áp dụng tại bất kỳ điểm phát triển nào, thường là khi số lượng giao diện phát triển và hệ thống phức tạp.
  3. giao diện Subsystem không nhận thức được dùng cho mặt tiền và họ không nên có bất kỳ tài liệu tham khảo của giao diện Facade
  4. Facade pattern nên được áp dụng cho các loại hình tương tự như giao diện, mục đích của nó là để cung cấp một giao diện duy nhất chứ không phải là nhiều giao diện mà không được loại tương tự của công việc sơ đồ lớp

Facade:

enter image description here

Adaptor:

  1. Đó là một mô hình cấu trúc
  2. Nó rất hữu ích để 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 Bộ điều hợp:

enter image description here

Bạn có thể tìm thêm chi tiết về Adaptor trong bài SE này:

Difference between Bridge pattern and Adapter pattern

khác biệt chính:

  1. Facade định nghĩa một giao diện mới, trong khi Bộ điều hợp sử dụng giao diện cũ. Bộ chuyển đổi 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à hàm bao; nhưng chúng là các loại trình bao bọc 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ế một giao diện hiện

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

+0

Thích xem sơ đồ! Chỉ cần một số làm rõ mặc dù, khi tôi thay đổi số lượng/loại tham số không có nghĩa là nó không phải là một Adapter nữa? như 'someMethod (int year, int month)' được gán cho 'someMethod (DateTime start, DateTime end)' hoặc cho phép nói 'someMethod()' ủy nhiệm cho 'someMethod (T param)' –

+0

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

+0

lời giải thích thực sự tốt đẹp. –

0

Mặt tiền thường được đối chiếu 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       | 
+--------------------------------------------------------------+-----------------------------------------------+