- vừa được xem lúc

Design Pattern: Adapter

0 0 27

Người đăng: Nguyễn Nam Anh

Theo Viblo Asia

Đặ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 Interface
interface TypeCPhone { void chargeByTypeC();
} // Interface của Service
interface LightningPhone { void chargeByLightning();
} // Service
class IPhone implements LightningPhone { @Override public void chargeByLightning() {}
} // Adapter
class TypeCToLightningPhoneAdapter implements TypeCPhone { private LightningPhone lightningPhone; public TypeCToLightningPhoneAdapter(LightningPhone lightningPhone) { this.lightningPhone = lightningPhone; } @Override public void chargeByTypeC() { lightningPhone.chargeByLightning(); }
} public class Demo { static void chargeMyXiaomiPhone(TypeCPhone phone) { phone.chargeByTypeC(); } public static void main(String[] args) { IPhone iPhone = new IPhone(); TypeCToLightningPhoneAdapter adapter = new TypeCToLightningPhoneAdapter(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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 299

- vừa được xem lúc

Giới thiệu về Builder Design Pattern

Nguồn: refactoring.guru. Builder. Ý đồ.

0 0 44

- vừa được xem lúc

Một ví dụ nhỏ về Factory method

Trong bài viết trước mình đã giới thiệu tới các bạn về Abstract Factory pattern, các bạn quan tâm có thể theo dõi lại tại đây. Để tiếp tục về chủ đề design pattern trong bài viết này mình sẽ trình bày những khái niệm, ưu nhược điểm và các sử dụng của một creational design pattern khác đó là Factory

0 0 38

- vừa được xem lúc

Tôi đã dùng Service Pattern trong NuxtJS như thế nào ?

Giới thiệu. Trong quá trình làm VueJS NuxtJS hay thậm chí là Laravel mình cũng hay áp dụng các pattern như Service hoặc Repository.

0 0 69

- vừa được xem lúc

Hướng dẫn Adapter Design Pattern

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về Adapter Design Pattern qua cấu trúc, cánh triển khai, ví dụ, ưu điểm nhược điểm và ứng dụng của nó. Đây là bài viết đầu tiên của mình nên sẽ không trán

1 1 63

- vừa được xem lúc

Giới thiệu về Prototype Design Pattern

Ý đồ. Prototype là một creational design pattern cho phép bạn sao chép các object hiện có mà không làm cho code của bạn phụ thuộc vào các class của chúng.

0 0 52