2013-09-04 82 views
75

Bạn có thể giải thích rõ sự khác biệt giữa ProxyTrang trí không?Sự khác biệt giữa Proxy và Mẫu trang trí

Sự khác biệt chính tôi nhìn thấy là khi chúng ta giả định rằng Proxy sử dụng phầnDecorator sử dụng hợp sau đó nó có vẻ là rõ ràng rằng bằng cách sử dụng nhiều (một hoặc nhiều) trang trí bạn có thể sửa đổi/thêm chức năng cho cá thể có sẵn (trang trí), trong khi Proxy có cá thể bên trong của lớp proxy và đại biểu cho nó thêm một số tính năng bổ sung (hành vi proxy).

Câu hỏi được - Có Proxy tạo ra với sự kết hợp vẫn là Proxy hay đúng hơn Decorator? Có được phép (theo định nghĩa trong các mẫu GoF) để tạo Proxy với tổng hợp không?

+1

Một số liên kết: [Proxy] (http://sourcemaking.com/design_patterns/proxy) và [Decorator] (http://sourcemaking.com/design_patterns/decorator) –

+5

Bạn lấy ý tưởng rằng Proxy sử dụng bố cục ở đâu và trang trí sử dụng tổng hợp? – CPerkins

+1

@CPerkins xem nhận xét của tôi về câu trả lời của Rahul Tripathi. –

Trả lời

50

Decorator mẫu tập trung vào chức năng tự động thêm vào một đối tượng, trong khi Proxy mẫu tập trung vào việc kiểm soát quyền truy cập vào một đối tượng.

EDIT: -

Mối quan hệ giữa một Proxy và đối tượng thực thường được đặt ở thời gian biên dịch, Proxy instantiates nó một cách nào đó, trong khi Decorator được gán cho các đối tượng trong thời gian chạy , chỉ biết giao diện của đối tượng.

+4

Proxy vẫn có thể được sử dụng để thêm chức năng. Hãy suy nghĩ về proxy AOP. –

+4

Hoàn toàn đồng ý với Ngài. Tôi sẽ chuyển đổi nó nói cách khác những gì tôi có nghĩa là với Proxy Pattern, lớp proxy có thể ẩn thông tin chi tiết của một đối tượng từ khách hàng của nó. Do đó, khi sử dụng Proxy Pattern, chúng ta thường tạo một thể hiện của abject bên trong lớp proxy. Và khi sử dụng Mẫu trang trí, chúng tôi thường chuyển đối tượng gốc làm tham số cho hàm tạo của trình trang trí. –

+0

Trong trường hợp này khi cá thể là 'ẩn' trong proxy thì sự khác biệt rõ ràng đối với tôi (như tôi đã viết), tuy nhiên tôi nghĩ rằng mọi người thường gọi là lớp proxy để lấy đối tượng proxy đã được truyền làm tham số hàm tạo. Trong trường hợp này, sự khác biệt của việc thêm chức năng mới hoặc kiểm soát là (rất) mỏng đối với tôi. –

30

Trang trí lấy tham chiếu cho đối tượng được trang trí (thường thông qua hàm tạo) trong khi Proxy chịu trách nhiệm tự làm điều đó.

Proxy có thể không nhanh chóng gói đối tượng ở tất cả (như thế này làm ORMs để ngăn chặn truy cập không cần thiết để DB nếu lĩnh vực đối tượng/thu khí không được sử dụng) trong khi Decorator luôn giữ liên kết đến dụ bọc thực tế.

Proxy thường được sử dụng bởi các khung để thêm bảo mật hoặc lưu vào bộ nhớ cache/lazing và được xây dựng theo khung (không phải do chính nhà phát triển thường xuyên).

Decorator thường được sử dụng để thêm hành vi mới đến các lớp học cũ hoặc di sản của nhà phát triển bản thân dựa trên giao diện thay vì sau đó lớp học thực tế (vì vậy nó hoạt động trên phạm vi rộng các trường hợp giao diện, Proxy là khoảng lớp bê tông).

58

Câu trả lời được chấp nhận không hoàn toàn chính xác. Sự khác biệt thực sự không phải là quyền sở hữu (thành phần so với tập hợp), mà là loại thông tin.

A Trang tríluôn là đã chuyển cho người được ủy quyền.A Proxycó thể tự tạo hoặc có thể nó đã được tiêm.

Nhưng một số Proxyluôn là biết (loại) cụ thể hơn của người được ủy quyền. Nói cách khác, Proxy và người được ủy quyền sẽ có cùng loại cơ sở, nhưng Proxy điểm đối với một số loại có nguồn gốc. A Trang trí trỏ đến loại cơ sở riêng của nó. Vì vậy, sự khác biệt là trong thông tin thời gian biên dịch về loại người được ủy quyền.

Trong ngôn ngữ động, nếu người được ủy quyền được tiêm và có cùng giao diện thì không có sự khác biệt.

Câu trả lời cho câu hỏi của bạn là "Có".

+1

"Nhưng một Proxy luôn luôn biết (cụ thể hơn) loại của các delegatee." Tôi không nghĩ rằng đó là sự thật. Hãy tưởng tượng proxy từ xa. Cơ chế ủy quyền không cần biết bất kỳ chi tiết cụ thể nào của đối tượng ở xa. Hệ thống từ xa đăng ký đối tượng với giao diện được chỉ định. Và proxy cục bộ hiển thị cùng một giao diện. – Alexey

+1

Tôi lấy một lớp học này tại Amazon từ một giảng viên thỉnh giảng, những người biết công cụ của mình. Có sự khác biệt giữa việc sử dụng tệp "proxy" (ví dụ: với dịch vụ web) và Mẫu thiết kế proxy. Các UML của mẫu Proxy và của mẫu Decorator có thể khác nhau. Nhưng không có gì ngăn cản Proxy có cùng API với người được ủy nhiệm của nó. Decorator là một tập hợp con nghiêm ngặt của Proxy, nhưng một Decorator vẫn có thể được gọi là Proxy tùy thuộc vào việc API bên dưới có được bảo đảm * giống nhau hay không. – cdunn2001

11

khác biệt chính:

  1. Proxy cung cấp giao diện tương tự. Trang trí cung cấp giao diện nâng cao.
  2. Trang tríProxy có các mục đích khác nhau nhưng có cấu trúc tương tự nhau. Cả hai đều mô tả cách cung cấp một mức độ gián tiếp cho một đối tượng khác và các triển khai giữ một tham chiếu đến đối tượng mà chúng chuyển tiếp các yêu cầu.
  3. Trang trí có thể được xem dưới dạng Biến thể tổng hợp chỉ với một thành phần. Tuy nhiên, một Người trang trí bổ sung thêm các trách nhiệm bổ sung - nó không nhằm mục đích tập hợp đối tượng.
  4. Decorator hỗ trợ đệ quy phần
  5. Các Decorator lớp tuyên bố một phần mối quan hệ với LCD giao diện (Thấp nhất Lớp Mẫu), và là thành viên dữ liệu này được khởi tạo trong constructor của nó.
  6. Sử dụng Proxy để khởi tạo lười biếng, cải thiện hiệu suất của bộ nhớ đệm đối tượng và kiểm soát truy cập cho khách hàng/người gọi

Sourcemaking bài viết trích dẫn những điểm tương đồng và khác biệt trong cách tuyệt vời.

liên quan SE câu hỏi/liên kết:

When to Use the Decorator Pattern?

What is the exact difference between Adapter and Proxy patterns?

0

Proxy và trang trí khác nhau về mục đích và nơi họ tập trung vào việc thực hiện nội bộ. Proxy dùng để sử dụng một đối tượng từ xa, xử lý chéo hoặc đối tượng mạng chéo như thể nó là một đối tượng cục bộ. Decorator là để thêm hành vi mới vào giao diện ban đầu.

Mặc dù cả hai mẫu đều có cấu trúc tương tự nhau, phần lớn sự phức tạp của Proxy nằm trong việc đảm bảo truyền thông phù hợp với đối tượng nguồn. Trang trí, mặt khác, tập trung vào việc thực hiện các hành vi được thêm vào.

+0

Bạn đang nói gì khác với 4 câu trả lời khác đã có ở đây? –

+0

Tôi không biết tất cả có ở đó không. Tôi chỉ cảm thấy thôi thúc kêu vang sau khi đọc những câu trả lời trước đó. –

+0

Và chúng tôi khuyến khích bạn không nên kêu vang, bởi vì khi ai đó đang tìm kiếm câu trả lời, họ cần đọc câu trả lời của bạn mà không thực sự thêm bất kỳ thông tin mới nào, và do đó họ sử dụng hết thời gian, nhưng không có gì hữu ích hơn. Cảm ơn. –