Sự khác biệt giữa các mẫu thiết kế Facade, Proxy, Adaptor và Decorator? [đóng cửa]


135

Sự khác biệt giữa các mẫu thiết kế Facade, Proxy, Adaptor và Decorator là gì?

Tôi chưa bao giờ đọc một lời giải thích rõ ràng, những gì của bạn?



@gavenkoa câu hỏi khác chỉ là về proxy và trang trí
310291

2
Thật đáng kinh ngạc khi một số câu hỏi đóng tiết lộ bản thân rất hữu ích.
Lu-ca

Câu trả lời:


285

Bộ điều hợp điều chỉnh một lớp / đối tượng nhất định cho một giao diện mới. Trong trường hợp trước đây, nhiều thừa kế thường được sử dụng. Trong trường hợp sau, đối tượng được bao bọc bởi một đối tượng bộ điều hợp phù hợp và được truyền xung quanh. Vấn đề chúng ta đang giải quyết ở đây là các giao diện không tương thích .

Facade giống như một cổng đơn giản cho một bộ chức năng phức tạp. Bạn tạo một hộp đen để khách hàng bớt lo lắng tức là làm cho giao diện đơn giản hơn .

Proxy cung cấp giao diện giống như lớp ủy nhiệm và thường tự mình thực hiện một số công việc vệ sinh. (Vì vậy, thay vì tạo nhiều bản sao của một vật nặng, Xbạn tạo các bản sao của một proxy nhẹ P, lần lượt quản lý Xvà dịch các cuộc gọi của bạn theo yêu cầu.) Bạn đang giải quyết vấn đề của khách hàng khỏi việc phải quản lý một đối tượng nặng và / hoặc phức tạp .

Công cụ trang trí được sử dụng để thêm nhiều thuốc súng vào các đối tượng của bạn (lưu ý các thuật ngữ đối tượng - bạn thường trang trí các đối tượng một cách linh hoạt khi chạy). Bạn không ẩn / làm suy yếu các giao diện hiện có của đối tượng mà chỉ mở rộng nó khi chạy .

Bây giờ bạn đã tham gia trang trí, có lẽ bạn sẽ muốn biết lý do tại sao nhấn mạnh vào đối tượng từ - một số ngôn ngữ (như Java) chỉ đơn giản là không cho phép thừa kế ảo (nghĩa là nhiều kế thừa như C ++) để cho phép bạn thực hiện điều này tại thời gian biên dịch.

Vì chúng tôi đã kéo theo nhiều kế thừa (và kim cương đáng sợ), bạn sẽ tìm ra các mixin - được sắp xếp chuỗi tuyến tính của các giao diện để khắc phục các vấn đề của nhiều kế thừa. Tuy nhiên, mixins không trộn tốt. Và chúng tôi kết thúc với những đặc điểm - vâng, những đốm sáng hành vi nhỏ không trạng thái mà bạn thấy bật lên mọi lúc trong các tham số mẫu trong C ++. Các đặc điểm cố gắng giải quyết các vấn đề về thành phần và phân rã hành vi một cách tao nhã trong khi không đi theo nhiều kế thừa hoặc xâu chuỗi theo lệnh.


1
HTH! Tôi đã cố gắng đưa vào càng nhiều càng tốt mà không quá mơ hồ. Xin lỗi vì tôi không thể làm tốt hơn. Tôi đã đọc (luận án tiến sĩ) về các đặc điểm một mình. Do đó kiến ​​thức của tôi khá hạn chế và tôi không đủ tốt để phù hợp với tất cả các mẫu trong không gian này;)
dirkgently

Bạn dự đoán một câu hỏi trong tương lai về mixin và đặc điểm nhưng tôi chưa thấy chúng!
310291

1
Một liên kết so sánh tốt (thông qua wikipedia) cho ba người đầu tiên (Trình trang trí khá khác biệt): NetObjectives
Liviu

@Liviu Liên kết của bạn đã chết. Tôi giả sử ban đầu bạn chỉ vào đó , nhưng nội dung bây giờ dường như nằm sau một lần đăng nhập.
Jonathan H

@Sheljohn Link đã cập nhật: p: Một liên kết so sánh tốt (thông qua wikipedia) cho ba người đầu tiên (Trình trang trí khá khác biệt) NetObjectives (Văn bản truy xuất lại, xem "betweem": "Một trong những câu hỏi thường gặp hơn trong lớp là" những gì Bộ điều hợp, Proxy và Mặt tiền khác nhau? Chúng thực sự giống với tôi ".)
Liviu

16

Mặt tiền

Bạn có thể sử dụng mặt tiền, ví dụ, để thực hiện các cuộc gọi đến API dễ dàng hơn. Hãy xem ví dụ này về một mặt tiền từ xa. Ý tưởng ở đây là việc thực hiện đầy đủ mã trên máy chủ bị ẩn khỏi máy khách. Máy khách gọi 1 phương thức API, lần lượt, có thể thực hiện 1 hoặc nhiều lệnh gọi API trên máy chủ.

Bộ chuyển đổi

Một ví dụ tốt về điều này có thể được tìm thấy ở đây , trên Wikipedia. Một đối tượng khách Sourcemuốn gọi một phương thức trên một đối tượng khác Target, nhưng giao diện của đối tượng khác đó khác với những gì khách hàng đang mong đợi.

Nhập đối tượng bộ chuyển đổi.

Nó có thể nhận một cuộc gọi từ Sourceđối tượng và, đằng sau hậu trường, gọi Targetphương thức nên được sử dụng.

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

Đối với Proxy, tôi không có bất kỳ kinh nghiệm nào về mẫu thiết kế này.

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.