2012-11-28 42 views
10

Tôi đã học được cả hai mẫu nhưng không hiểu sự khác biệt giữa hai mẫu này.sự khác biệt giữa mô hình khách truy cập và chiến lược là gì?

Tôi không biết các tình huống, thời gian và địa điểm sử dụng các mẫu này.

Có thể giải thích sự khác biệt và trường hợp sử dụng không?

+3

Đây là cách hay để liên quan đến các mẫu khác nhau: http://www.cours.polymtl.ca/inf3700/divers/nonSoftwareExample/patexamples.html –

+0

Liên kết đẹp @ jco.owens!Liên kết –

+0

bị hỏng ngay bây giờ .. bạn có thể cập nhật @ jco.owens không? – Joe

Trả lời

3

Mẫu khách truy cập được sử dụng để duyệt qua phân cấp đối tượng và cung cấp một số chức năng như in hoặc báo cáo, v.v. . Các đối tượng trong cấu trúc phân cấp là các lượt truy cập.

Mẫu chiến lược được sử dụng để chọn một đường dẫn logic cụ thể dựa trên đầu vào. Ví dụ cổ điển là bộ lọc xác thực dựa trên giá trị trong tiêu đề HTTP Authorization, các chiến lược xác thực khác nhau như NTLM/Negotiate/Basic được chọn và chạy. Bộ lọc sẽ giữ một tham chiếu đến giao diện AuthenticationStrategy, dựa trên yêu cầu đến, một chiến lược xác thực cụ thể được chọn và gán cho tham chiếu này và mã sau không cần biết chiến lược chính xác đang được sử dụng.

+1

một ví dụ đơn giản về mô hình chiến lược - sử dụng việc thực hiện khác nhau của Comparator để sắp xếp một danh sách khác nhau? – Scorpion

15

Sự khác biệt chính là Mẫu chiến lược đóng gói một nhóm hành vi có liên quan, trong khi Mô hình khách truy cập gói gọn nhiều nhóm như vậy.

  • Bạn nên sử dụng Chiến lược Pattern khi bạn cần để đóng gói một hành vi - Nếu bạn có một gia đình của các thuật toán và bạn cần phải lựa chọn trong số chúng nó trong lúc chạy, bạn nên sử dụng chiến lược Pattern. Điều này rất phổ biến: nó xảy ra mỗi khi bạn program to an interface.
  • Bạn nên sử dụng Visitor Pattern để thực hiện đôi công văn - Nếu bạn có một nhóm các thuật toán cần phải được ảo trong mối quan hệ với nhiều hơn một đối tượng. Điều này ít phổ biến hơn, một phần vì nó khó thực hiện hơn nhiều.
+2

+1, bạn có thể biết thêm chi tiết với các ví dụ nhưng đó là một câu trả lời ngắn gọn geeky tốt. – Scorpion

+0

@ dasblinkenlight Bạn có thể xây dựng ý nghĩa của từ "Nếu bạn có một nhóm thuật toán cần phải ảo liên quan đến nhiều hơn một đối tượng". – Geek

+0

@Geek Ví dụ cổ điển là cây biểu thức. Một mặt, bạn có một nhóm các lớp học theo mô hình hỗn hợp (biểu thức cơ bản, biểu thức không đổi, biểu thức nhị phân, gọi hàm, v.v.) Mặt khác, bạn có một nhóm các lớp thực hiện các thuật toán (chuyển đổi thành XML, in ra tập tin văn bản, đánh giá, vv) Vì vậy, phương pháp mà bạn muốn gọi phụ thuộc vào loại phụ của biểu thức ** và ** loại phụ của thuật toán, do đó hành vi là ảo đối với nhiều hơn một lớp. Tên chính thức của nó là [* double dispatch *] (http://en.wikipedia.org/wiki/Double_dispatch). – dasblinkenlight

2

Visitor pattern ý:

Đại diện cho một hoạt động được thực hiện trên các yếu tố của một cấu trúc đối tượng. Khách truy cập cho phép bạn xác định một hoạt động mới mà không thay đổi các lớp của các phần tử mà nó hoạt động.

mẫu Sử dụng Visitor nếu:

  1. hoạt động tương tự phải được thực hiện trên các đối tượng của các loại khác nhau nhóm lại trong một cấu trúc
  2. Bạn cần phải thực hiện nhiều hoạt động riêng biệt và không liên quan .Nó tách hoạt động từ đối tượng Cấu trúc
  3. hoạt động mới phải được bổ sung mà không thay đổi trong cấu trúc đối tượng
  4. Thu thập các hoạt động có liên quan vào một lớp duy nhất hơn là buộc bạn phải thay đổi hoặc lấy lớp
  5. Thêm chức năng đến các thư viện lớp mà bạn không có nguồn hoặc không thể thay đổi nguồn

Mặc dù khách truy cập vỗ nhẹ tern cung cấp tính linh hoạt để thêm hoạt động mới mà không thay đổi mã hiện có trong Object, tính linh hoạt này đã đi kèm với một nhược điểm.

Nếu một đối tượng có thể truy cập mới đã được thêm vào, nó yêu cầu thay đổi mã trong các lớp khách truy cập & ConcreteVisitor. Có một giải pháp để giải quyết vấn đề này: Sử dụng sự phản chiếu, điều này sẽ có tác động đến hiệu suất.

Tham khảo oodesign articlesourcemaking bài viết để biết thêm chi tiết

mô hình chiến lược ý:

Định nghĩa một gia đình của các thuật toán, đóng gói mỗi người, và làm cho họ hoán đổi cho nhau. Chiến lược cho phép thuật toán thay đổi độc lập với khách hàng sử dụng nó.

Chiến lược cho phép bạn thay đổi đường ruột của đối tượng.

Tham khảo bên dưới câu hỏi SE để biết thêm chi tiết:

Real World Example of the Strategy Pattern

0

Ngoài sự khác biệt về hành vi nêu trên, tôi cũng đã trải qua một sự khác biệt về sự phụ thuộc và sử dụng trường hợp trong một dự án một khi tôi đã làm việc trên , như sau.

Ví dụ: Khách truy cập biết về các lớp cụ thể. Vì vậy, bạn sẽ linh hoạt hơn với chi phí thay đổi mã khách truy cập khi bạn thêm các lớp bê tông mới vào cấu trúc phân cấp. Không có gì trong Chiến lược. Trong bối cảnh này, Chiến lược trở nên phù hợp hơn nếu bạn chỉ có phương thức trả về một số đầu ra với một đầu vào đã cho, bất kể ngữ cảnh.

Hơn nữa, mẫu khách truy cập cũng được sử dụng để triển khai SRP của SOLID, để phân tách mối quan tâm.

0

Khách truy cập là khi bạn có một lớp học và bạn cần thêm chức năng mới cho mọi lớp trong gia đình đó mà không chạm vào lớp học (hoặc muốn có chức năng mới được định nghĩa ở một nơi - khách truy cập)

Chiến lược là khi bạn có một lớp học cần có khả năng làm việc gì đó để hoạt động đúng cách (chẳng hạn như sắp xếp một số đối tượng), nhưng bạn muốn khách hàng hoặc tiêm phụ thuộc của bạn nói cho họ biết cách nào để làm điều đó.

Các vấn đề liên quan