Adapter Pattern
Structural Pattern (nhóm cấu trúc) : các giải pháp giúp chúng ta sử dụng đối tượng (objects) và các lớp (classes) trong các cấu trúc lớn hơn nhưng vẫn đảm bảo được sự linh hoạt và hiệu quả của code .
Nhóm này gồm 7 mẫu thông dụng:
* Adapter
* Bridge
* Composite
* Decorator
* Facade
* Flyweight
* Proxy
Hôm nay mình sẽ cùng các bạn tìm hiểu đôi chút về Adapter nha ^^
1. Đặt vấn đề :
Giả sử hệ thống hiện tại của bạn cần làm việc với 1 thư viện mới, nhưng thiết kế của interface đấy lại khác hoàn toàn và không hề tương thích với hệ thống của bạn vấn đề khi bạn không muốn giải quyết vấn đề này qua việc sửa đổi code của hệ thống và dĩ nhiên là không thể thay đổi code của thư viện rồi. Giờ làm gì nhỉ? ✌.ʕʘ‿ʘʔ.✌
Giải pháp lúc này chính là ADAPTER, lúc này nó sẽ như người đứng giữa nhận request từ hệ thống của bạn và convert chúng tương thích với thư viện mới.
2. Adapter là gì ?
Adapter chính xác là gì nhỉ ? {•̃̾_•̃̾}
“Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.”
Adapter có nhiệm vụ “chuyển đổi interface của một class thành một interface khác mà client mong đợi”. Adapter cho phép các lớp không tương thích về interface có thể làm việc cùng nhau.
- Adapter còn có tên gọi khác là Wrapper
Lí thuyết là thế nhưng nói đơn giản dễ hiểu thì nó chính là ví dụ kinh điển sau đây:
Đây chắc hẳn là Adapter mà chúng ta thường gặp nhất
Khi bạn sử dụng ổ điện thông dụng ở nhiều quốc gia khác nhau sẽ khác nhau. Ở Việt Nam thường sử dụng ổ cắm điện có hai chân, trong khi một số thiết bị điện như laptop, điện thoại, tivi… lại có phích cắm 3 chân, đặc biệt là châu Âu, Mỹ là ba chân, như vậy chúng ta cần một bộ chuyển từ ba chân sang hai chân để có thể hoạt động được.
Ngoài ra, chúng ta có thể tìm thấy điều này trong cách sử dụng thẻ nhớ. Khi thiết bị của bạn không có đầu đọc thẻ nhớ tích hợp, bạn phải sử dụng bộ điều hợp để chuyển đổi dạng dữ liệu đầu vào có thể đọc được trên thiết bị nhận
Đó là 1 vài ví dụ trong thực tế về Adapter giờ chúng ta xem tiếp Adapter có gì nào ᕙ(⇀‸↼‶)ᕗ
2. Cách thức hoạt động của Adapter
Tiếp nhận các request từ Client và chuyển đổi chúng trở nên tương thích với interface mới.
- Client: Sử dụng các đối tượng có interface Target.
- Target: Interface chứa các chức năng được sử dụng bởi Client (domain specific). (°ロ°)☝
- Adaptee : Đây là lớp mà bạn muốn lớp Client sử dụng, nhưng hiện tại giao diện của nó không phù hợp .
- Adapter: Đây là lớp trung gian, thực hiện việc chuyển đổi giao diện cho Adaptee và kết nối Adaptee với Client.
3. Class Adapter & Object Adapter
- Class Adapter
Đây là một cách tiếp cận ít được sử dụng do nó còn nhiều hạn chế. Theo cách này, các lớp con (sub-classes) của class ‘Adapter’ => ‘Target’ và ‘Adaptee’. Class Adapter ghi đè các phương thức trong ‘Target’ interface để có thể dễ dàng nhận các request mà không cần sửa đổi => class Adapter sử dụng kế thừa để implement code.
- Object Adapter
Phương pháp tiếp cận này sử dụng Composion để implement ‘Adapter’ và ‘Adaptee’ đồng thời sử dụng mối quan hệ kế thừa giữa ‘Adapter’ và ’Target’. Lúc này, class Adapter sẽ giữ một instance của Adaptee như một class variable. Khi Client truy cập Adapter thông qua phương thức bị ghi đè (overriden) của Target interface, nó sử dụng phương thức của Adaptee để chuyển đổi và gửi thông báo, đồng thời ủy quyền(delegates) yêu cầu ban đầu cho ‘Adaptee’.
⇒ Object Adapter được sử dụng nhiều hơn Class Adapter
<(‘ .’ )>
4. Khi nào sử dụng đến Adapter
¯\(©¿©) /¯
- Khi cần kết nối hai hệ thống không tương thích interface.
- Khi cần giao tiếp với một API bên ngoài.
5. Kết
Adapter Pattern là một trong những mẫu lập trình thú vị vì nó khá quen thuộc với chúng ta và có tần suất sử dụng khá nhiều trong code, việc kết nối các hệ thống với nhau là điều hết sức bình thường và nó cũng luôn thay đổi. Nhưng không vấn đề gì, Adapter Pattern đã giải quyết một cách triệt để vấn đề này.
( ͡° ͜ʖ ( ͡° ͜ʖ ( ͡° ͜ʖ ( ͡° ͜ʖ ͡°) ͜ʖ ͡°)ʖ ͡°)ʖ ͡°)
Cảm ơn mọi người đã đọc hết chia sẻ của mình nha.