Design Pattern: Adapter

Đặt vấn đề Khi bạn muốn sạc iPhone bằng cáp type C => hãy dùng một cái Adapter mà có lỗ type C và đầu lightning. Khi bạn đang dùng data dưới dạng XML, nhưng lại muốn sử dụng một function của third party library mà nó chỉ nhận param là JSON => hãy dùng

Đặt vấn đề

Khi bạn muốn sạc iPhone bằng cáp type C => hãy dùng một cái Adapter mà có lỗ type C và đầu lightning.

Khi bạn đang dùng data dưới dạng XML, nhưng lại muốn sử dụng một function của third party library mà nó chỉ nhận param là JSON => hãy dùng Adapter để convert XML sang JSON.

Trong Android, bạn có một list item và muốn hiển thị nó lên RecyclerView => hãy dùng Adapter để convert data lên từng item_view.

Khái niệm

Adapter pattern cho phép interface của một class đã có sẵn được dùng như là một interface khác. Nó sẽ giúp class đã tồn tại đó làm việc với những thằng khác mà không thay đổi source code.

Nghe vẫn hơi trừu tượng đúng không nhỉ? Chúng ta sẽ từ từ đi bóc tách hết cái lớp vỏ ngoài khó hiểu này nhé.

Tuy nhiên thì có 2 cách dùng adapter là Object AdapterClass Adapter. Chúng ta sẽ cùng đi tìm hiểu chi tiết từng cách.

Object Adapter Pattern

Sơ đồ lớp

Chúng ta sẽ implement interface bằng cách uỷ quyền tới object adaptee lúc run-time.

Mình sẽ giải thích chi tiết thêm một chút:

  1. Client là class đã có sẵn mà mình nhắc đến trong phần khái niệm nhé.
  2. Client Interface giờ là interface cha của Client. Những thằng khác muốn giao tiếp Client thì phải follow thằng interface cha này nhé.
  3. Service là một thằng third party mà chỉ nhận param là JSON như mình đặt vấn đề.
  4. Adapter implement Client Interface và chứa instance của class Service (object adaptee). Mỗi khi gọi đến method của Adapter, nó sẽ gọi đến method của Service này.
  5. Như vậy chúng ta đã có thể làm việc với thằng Service mà không cần sửa code ở Client.

Code sample

// Client InterfaceinterfaceTypeCPhone{voidchargeByTypeC();}// Interface của ServiceinterfaceLightningPhone{voidchargeByLightning();}// ServiceclassIPhoneimplementsLightningPhone{@OverridepublicvoidchargeByLightning(){}}// AdapterclassTypeCToLightningPhoneAdapterimplementsTypeCPhone{privateLightningPhone lightningPhone;publicTypeCToLightningPhoneAdapter(LightningPhone lightningPhone){this.lightningPhone = lightningPhone;}@OverridepublicvoidchargeByTypeC(){
        lightningPhone.chargeByLightning();}}publicclassDemo{staticvoidchargeMyXiaomiPhone(TypeCPhone phone){
        phone.chargeByTypeC();}publicstaticvoidmain(String[] args){IPhone iPhone =newIPhone();TypeCToLightningPhoneAdapter adapter =newTypeCToLightningPhoneAdapter(iPhone);chargeMyXiaomiPhone(adapter);}}

Class Adapter pattern


Class Adapter thì không cần wrap object nào cả vì nó kế thừa từ cả ClientService.

Rất tiếc là Java không support đa kế thừa nên chúng ta không có code sample bằng Java cho phần này.

Kết luận

Adapter là một design pattern khá quen thuộc với chúng ta. Qua phần giải thích và một chút code mẫu, mong mọi người hiểu thêm về nó.

Reference

Nguồn: viblo.asia

Bài viết liên quan

Sự Khác Nhau Giữa Domain và Hosting Là Gì?

Sự khác nhau giữa domain và hosting là gì? Bài này giải thích ngắn và dễ hiểu nh

Shared Hosting hay VPS Hosting: Lựa chọn nào dành cho bạn?

Bài viết giải thích rõ shared hosting và vps hosting là gì và hướng dẫn chọn lựa

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=