Sự khác nhau giữa Strategy và Dependency Injection?

hôm nay mình đọc head first design pattern mình học bài Strategy và mình thấy nó giống y như Dependency Injection. Vậy có khác gì giữa chúng không ? mình có lên stackoverflow nhưng đọc không hiểu

cả 2 cái đều như nhau. có thể coi strategy pattern là 1 phiên bản của DI

3 Likes

Strategy pattern là một design pattern nhóm hành vi, quan tâm hành vi hơn đối tượng cụ thể. Mục đích là tách phần implement cụ thể của 1 hành vi sang 1 class khác. Strategy pattern không nói gì về việc cách mà 1 implement được tạo ra như thế nào mà chỉ đơn giản là dùng thôi

Dependency Injection là 1 tổ hợp các pattern nhằm giải quyết vấn đề liên quan đến sự phụ thuộc giữa các class. Cụ thể Dependency Injection là sự kết hợp của nhiều design pattern khác nhau: nhóm hành vi, nhóm cấu trúc lẫn nhóm khởi tạo để:

  • Giảm sự phụ thuộc giữa các thành phần. Thay đổi implement dễ dàng mà không mất đi tính tổng quát
  • Tái sử dụng code
  • Che giấu việc khởi tạo cũng như mối quan hệ giữa các thành phần ở nơi sử dụng
  • Giảm sai sót trong quá trình khởi tạo
3 Likes

Như @drgnz có để cập (và cậu có lẽ cũng đã thấy), strategy pattern và DI có implement tương đồng nhau trong một số trường hợp. Chuyện này cũng phổ biến, chẳng hạn như cậu có thể sẽ gặp sự tương đồng khi implement decorator pattern và proxy pattern.
Điểm khác biệt của Stategy pattern và DI nằm ở vấn đề mà nó giải quyết (hay use case cụ thể của pattern).
DI pattern:

  • Hướng tới giải quyết vấn đề coupling giữa các module với nhau.
    Nếu cậu có một module business logic, trong đó có phụ thuộc vào module gọi tới database, nếu cậu sử dụng DI, 2 module này sẽ không bị phụ thuộc chặt chẽ với nhau. Cậu hoàn toàn có thể switch giữa các cài đặt khác nhau của module bị phụ thuộc, vì cậu đã định nghĩa cách để “tiêm” phụ thuộc rồi. Điều này khá tương đồng với strategy pattern.
  • Đúng như cái tên “tiêm phụ thuộc”, thường thì sự phụ thuộc này được xác định rõ ràng lúc khởi tạo ứng dụng/object, và chỉ được “tiêm” 1 lần. Cậu thường không muốn switch giữa các phiên bản cài đặt khác nhau của module bị phụ thuộc ở runtime đâu :smile:

Strategy pattern:

  • Giúp cậu giải quyết việc switch một loạt các “chiến lược” khác nhau ở runtime.
    Ví dụ tiêu biểu nhất là khi cậu sử dụng functional programming (Stream API trong Java 8+ chẳng hạn), cậu hoàn toản có thể switch các chiến lược map khác nhau (hoặc bất cứ high ordered function nào) để cho ra collection mà cậu mong muốn.
  • Cậu hoàn toàn có thể đổi các chiến lược khác nhau, miễn là nó theo đúng hợp đồng dược định nghĩa ở interface. Việc định nghĩa này là bắt buộc, không như DI.

Hope it helps!

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?