JavaRush /Blog Java /Random-VI /Sự khác biệt giữa các mẫu Trạng thái và Chiến lược trong ...
0xFF
Mức độ
Донецк

Sự khác biệt giữa các mẫu Trạng thái và Chiến lược trong Java

Xuất bản trong nhóm
Để sử dụng đúng các mẫu Trạng tháiChiến lược trong các ứng dụng Java cốt lõi, điều quan trọng là các lập trình viên Java phải hiểu rõ sự khác biệt giữa chúng. Mặc dù cả hai mẫu, Trạng thái và Chiến lược, đều có cấu trúc tương tự nhau và cả hai đều dựa trên nguyên tắc mở/đóng, đại diện cho chữ “O” trong nguyên tắc SOLID , nhưng chúng hoàn toàn khác nhau về mục đích . Sự khác biệt giữa các mẫu Trạng thái và Chiến lược trong Java - 1Mẫu Chiến lược trong Java được sử dụng để đóng gói các bộ thuật toán có liên quan nhằm mang lại sự linh hoạt khi thực thi cho máy khách. Máy khách có thể chọn bất kỳ thuật toán nào trong thời gian chạy mà không thay đổi ngữ cảnh của lớp sử dụng Strategy. Một số ví dụ phổ biến về mẫu Chiến lược là viết mã sử dụng các thuật toán, chẳng hạn như mã hóa, nén hoặc sắp xếp. Mặt khác, mẫu Trạng thái cho phép một đối tượng hoạt động khác nhau ở các trạng thái khác nhau. Bởi vì trong thế giới thực, một vật thể thường có các trạng thái và nó hoạt động khác nhau ở các trạng thái khác nhau, ví dụ như máy bán hàng tự động chỉ bán hàng nếu nó ở trạng thái đó hasCoin, nó không bán cho đến khi bạn bỏ đồng xu vào đó. Bây giờ bạn có thể thấy rõ sự khác biệt giữa các mẫu Chiến lược và Trạng thái, đây là những mục đích khác nhau. Mẫu Trạng thái giúp đối tượng quản lý trạng thái, trong khi mẫu Chiến lược cho phép khách hàng chọn một hành vi khác. Một sự khác biệt khác không dễ nhận thấy là ai đang thúc đẩy sự thay đổi trong hành vi. Trong trường hợp mẫu Chiến lược, đây là ứng dụng khách cung cấp nhiều chiến lược khác nhau cho bối cảnh; trong mẫu Trạng thái, quá trình chuyển đổi được kiểm soát bởi bối cảnh hoặc trạng thái của chính đối tượng. Ngoài ra, nếu bạn tự quản lý các thay đổi trạng thái trong đối tượng Trạng thái thì phải có tham chiếu đến ngữ cảnh, ví dụ: máy bán hàng tự động phải có khả năng gọi một phương thức setState()để thay đổi trạng thái hiện tại của ngữ cảnh. Mặt khác, đối tượng Chiến lược không bao giờ chứa tham chiếu đến ngữ cảnh; chính khách hàng sẽ chuyển Chiến lược mà nó lựa chọn cho ngữ cảnh. Sự khác biệt giữa các mẫu Trạng thái và Chiến lược là một trong những câu hỏi phỏng vấn phổ biến về các mẫu Java , trong bài viết về các mẫu Java này chúng ta sẽ xem xét kỹ hơn về nó. Chúng ta sẽ khám phá một số điểm tương đồng và khác biệt giữa các mẫu Chiến lược và Trạng thái trong Java để giúp bạn nâng cao hiểu biết về các mẫu này.

Điểm tương đồng giữa các mẫu Trạng thái và Chiến lược

Nếu bạn nhìn vào sơ đồ UML của các mẫu Trạng thái và Chiến lược, bạn sẽ nhận thấy rằng cả hai đều trông giống nhau. Một đối tượng sử dụng Trạng thái để thay đổi hành vi của nó được gọi là Context-object, tương tự, một đối tượng sử dụng Chiến lược để thay đổi hành vi của nó được gọi là Context-object. Hãy nhớ rằng client tương tác với Context-object. Trong trường hợp mẫu Trạng thái, bối cảnh ủy quyền gọi các phương thức đến một đối tượng Trạng thái, được giữ làm đối tượng hiện tại và trong trường hợp mẫu Chiến lược, bối cảnh sử dụng đối tượng Chiến lược làm tham số hoặc được cung cấp trong quá trình tạo bối cảnh của đối tượng. Sơ đồ UML của mẫu Trạng thái trong Java Sự khác biệt giữa các mẫu Trạng thái và Chiến lược trong Java - 2 Sơ đồ UML này cho mẫu Trạng thái mô tả vấn đề kinh điển về việc tạo ra một thiết kế máy bán hàng tự động hướng đối tượng trong Java. Bạn có thể thấy rằng trạng thái của máy bán hàng tự động được thể hiện bằng giao diện, sau đó giao diện này có phần triển khai để thể hiện trạng thái cụ thể. Mỗi trạng thái cũng có các tham chiếu đến ngữ cảnh đối tượng để thực hiện chuyển đổi sang trạng thái khác do các hành động được gọi trong ngữ cảnh. Sơ đồ UML của mẫu Chiến lược trong Java Sự khác biệt giữa các mẫu Trạng thái và Chiến lược trong Java - 3 Sơ đồ UML này cho mẫu Chiến lược chứa các loại triển khai chức năng. Vì có nhiều thuật toán sắp xếp nên mẫu thiết kế này cho phép khách hàng chọn một thuật toán khi sắp xếp các đối tượng. Trên thực tế, khung công tác Bộ sưu tập Java sử dụng mẫu này để triển khai một phương thức Collections.sort()dùng để sắp xếp các đối tượng trong Java. Sự khác biệt duy nhất là thay vì cho phép máy khách chọn một thuật toán sắp xếp, nó cho phép nó chỉ định chiến lược so sánh bằng cách chuyển một phiên bản của giao diện Comparator hoặc Comparable sang Java . Chúng ta hãy xem xét một số điểm tương đồng giữa hai mẫu thiết kế chính này trong Java:
  1. Cả hai mẫu Trạng thái và Chiến lược đều giúp dễ dàng thêm trạng thái và chiến lược mới mà không ảnh hưởng đến bối cảnh của đối tượng sử dụng chúng.

  2. Cả hai điều này đều duy trì mã của bạn theo nguyên tắc mở/đóng , nghĩa là thiết kế sẽ mở cho các tiện ích mở rộng nhưng không cho phép sửa đổi. Trong trường hợp các mẫu Trạng thái và Chiến lược, bối cảnh của đối tượng không được sửa đổi, giới thiệu các Trạng thái mới hoặc Chiến lược mới hoặc bạn không cần sửa đổi bối cảnh của trạng thái khác hoặc những thay đổi tối thiểu.

  3. Giống như bối cảnh đối tượng bắt đầu bằng trạng thái khởi tạo của đối tượng trong mẫu Trạng thái, bối cảnh đối tượng cũng có một chiến lược mặc định trong trường hợp mẫu Chiến lược trong Java.

  4. Mẫu Trạng thái thể hiện các hành vi khác nhau dưới dạng các trạng thái đối tượng khác nhau, trong khi mẫu Chiến lược thể hiện các hành vi khác nhau dưới dạng các chiến lược đối tượng khác nhau.

  5. Cả hai mẫu Chiến lược và Trạng thái đều phụ thuộc vào các lớp con thực hiện hành vi. Mỗi chiến lược cụ thể mở rộng một Chiến lược trừu tượng; mỗi trạng thái là một lớp con của một giao diện hoặc lớp trừu tượng được sử dụng để thể hiện Trạng thái.

Sự khác biệt giữa các mẫu Chiến lược và Trạng thái trong Java

Vì vậy, bây giờ chúng ta biết rằng các mẫu Trạng thái và Chiến lược có cấu trúc tương tự nhau, nhưng mục đích của chúng là khác nhau. Hãy xem xét một số khác biệt chính giữa các mẫu thiết kế này.
  1. Mẫu Chiến lược bao gồm một tập hợp các thuật toán liên quan và cho phép khách hàng sử dụng các hành vi có thể hoán đổi cho nhau bất kể thành phần và ủy quyền trong thời gian chạy, mặt khác, mẫu Trạng thái giúp một lớp thể hiện các hành vi khác nhau ở các trạng thái khác nhau.

  2. Sự khác biệt tiếp theo giữa các mẫu Trạng thái và Chiến lược là Trạng thái đóng gói trạng thái của một đối tượng, trong khi mẫu Chiến lược đóng gói một thuật toán hoặc chiến lược. Vì trạng thái được liên kết với một đối tượng nên nó không thể được sử dụng lại, nhưng bằng cách tách một chiến lược hoặc thuật toán khỏi ngữ cảnh của nó, chúng ta có thể sử dụng lại nó.

  3. Trong mẫu Trạng thái, trạng thái cá nhân có thể chứa tham chiếu đến bối cảnh để thực hiện chuyển đổi giữa các trạng thái, nhưng Chiến lược không chứa tham chiếu đến bối cảnh nơi nó được sử dụng.

  4. Việc triển khai Chiến lược có thể được truyền dưới dạng tham số cho đối tượng sẽ sử dụng nó, ví dụ: Collection.sort() lấy Bộ so sánh là một chiến lược. Mặt khác, trạng thái là một phần của chính bối cảnh của đối tượng và theo thời gian, bối cảnh của đối tượng sẽ chuyển từ trạng thái này sang trạng thái khác.

  5. Mặc dù cả Chiến lược và Trạng thái đều tuân theo nguyên tắc mở/đóng, Chiến lược cũng tuân theo Nguyên tắc trách nhiệm duy nhất vì mỗi Chiến lược chứa một thuật toán riêng, các chiến lược khác nhau độc lập với nhau. Thay đổi một chiến lược không đòi hỏi phải thay đổi một chiến lược khác.

  6. Một điểm khác biệt về mặt lý thuyết giữa các mẫu Chiến lược và Trạng thái là người tạo xác định phần “Như thế nào” của đối tượng, ví dụ: đối tượng sắp xếp “Cách” sắp xếp dữ liệu, mặt khác, mẫu Trạng thái xác định phần “cái gì” và “khi nào” của đối tượng, ví dụ: một đối tượng có thể làm gì khi nó ở một trạng thái nhất định.

  7. Thứ tự chuyển đổi trạng thái được xác định rõ ràng trong mẫu Trạng thái; không có yêu cầu nào như vậy đối với mẫu Chiến lược. Khách hàng có quyền tự do lựa chọn bất kỳ cách triển khai Chiến lược nào theo lựa chọn của mình.

  8. Một số ví dụ phổ biến của mẫu Chiến lược là việc đóng gói các thuật toán, chẳng hạn như thuật toán sắp xếp, thuật toán mã hóa hoặc thuật toán nén. Nếu bạn thấy mã của mình phải sử dụng các loại thuật toán liên quan khác nhau, bạn nên cân nhắc sử dụng mẫu Chiến lược. Mặt khác, việc nhận biết cách sử dụng mẫu Trạng thái khá dễ dàng, nếu bạn cần kiểm soát trạng thái và chuyển đổi giữa các trạng thái mà không có nhiều câu lệnh điều kiện lồng nhau thì mẫu Trạng thái là mẫu phù hợp để sử dụng.

  9. Điểm khác biệt cuối cùng nhưng quan trọng nhất giữa các mẫu Trạng thái và Chiến lược là việc thay đổi Chiến lược được thực hiện bởi Khách hàng, trong khi thay đổi đối với Trạng thái có thể được thực hiện bởi bối cảnh hoặc chính trạng thái của đối tượng.

Đây là tất cả về sự khác biệt giữa các mẫu Trạng thái và Chiến lược trong Java . Như tôi đã nói, cả hai đều trông giống nhau về lớp và sơ đồ UML, cả hai đều cung cấp các nguyên tắc mở/đóng và hành vi đóng gói. Sử dụng mẫu Chiến lược để đóng gói một thuật toán hoặc chiến lược được hiển thị trong bối cảnh trong thời gian chạy, có thể dưới dạng tham số hoặc đối tượng tổng hợp và sử dụng mẫu Trạng thái để kiểm soát chuyển đổi trạng thái trong Java. Bản gốc ở đây
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION