Adapter Pattern – Xoá nhoà khác biệt

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Viết nhiều về Design Pattern nhưng có vẻ đang thiếu bên Structural Pattern nên nay mạnh dạn viết cho anh em về Adapter Pattern.

Theo như truyền thống ở Kieblog thì pattern luôn chú trọng vào cái mục đích, nhớ rõ hiểu sâu chứ không đi thẳng vào code. Đi thằng vào code thì muôn hình vạn trạng, bạn thì làm Golang, bạn thì PHP, bạn thì Python nếu nhớ được concept là cách học chuẩn nhất.

Bắt đầu với Adapter Pattern nha!

  18 designer hàng đầu dự đoán về xu hướng UI/ UX trong năm 2022
  5 ứng dụng Android tuyệt vời dành cho Android Developer và Designer

Xem thêm Graphic Design tuyển dụng trên TopDev

1. Adapter pattern là gì?

Lại như truyền thống. F@!k, ông truyền thống gì mà lắm vậy?. Anh em tin tôi, truyền thống đôi khi là tốt. Bắt đầu chú ý vào chứ Adapter, cái tên không tự nhiên mà có.

Search thử adapter trên mạng ta sẽ có kết quả như này.

Adapter PatternNguồn ảnh / Source: google.com

Quan sát thì thấy mỗi cái adapter có 2 đầu, 1 đầu vào là cái ổ cắm 2 chấu và đầu ra có thể cũng là 2 chấu hoặc 1 chấu (ví dụ như cái cấp nguồn hoặc là sạc đầu tiên).

Rồi, tới thẳng định nghĩa

Adapter is a structural design pattern that allows objects with incompatible interfaces to collaborate.

Adapter là pattern cấu trúc, cho phép các object khác nhau về interfaces có thể work chung với nhau được.

Đấy, như là 2 cái đầu của hình adapter, Adapter Pattenr đơn giản là để hai thằng objects có interface khác nhau có thể work được với nhau.

Adapter PatternAdapter Pattern: Nguồn ảnh/Source: Dive Into DESIGN PATTERNS

Thêm quả hình nữa thì hợp lý luôn, Adapter Pattenr giúp cái xe ô tô (4 bánh không phải loại chạy xe lửa), thông qua dăm ba cái khúc gỗ trục xoay quỷ ma gì đó thì có thể chạy trên đường ray. Hợp lí.

2. Vấn đề

Quay lại với ví dụ trong nghề ha. Anh em tưởng tượng ta đang build một stock market monitoring app. Kiểu bao gồm các chart, dữ liệu chứng khoán và các diagrams xịn xò.

Ok, sau đó app anh em mình cần bổ sung analytics library (thống kê các kiểu cho manager). Nhưng vấn đề sẽ phát sinh, thằng quỷ Statistic Library chỉ work với JSON input. Nghĩa là đầu vào của nó chỉ nhận JSON, còn cái ouput của system hiện tại lại là XML.

Adapter PatternAdapter Pattern: Nguồn ảnh/Source: Dive Into DESIGN PATTERNS

3. Giải pháp

Đấy, các ông lại không tin tôi. Pattern giờ trở nên rõ ràng dễ hiểu, còn giải pháp cho vấn đề ở trên thì.

You can create an adapter. This is a special object that converts the interface of one object so that another object can under- stand it.

Bạn có thể tạo adapter. Cái object đặc biệt này convert interface từ một object sang một object khác và nó có thể hiểu được.

Ví dụ là vậy nhưng Adapter Pattern không đơn thuần chỉ là convert data đâu nha anh em. Một số điểm dưới đây cho anh em hiểu rõ hơn Pattern này work như thế nào?

  1. The adapter gets an interface, compatible with one of the existing objects (Adapter sẽ lấy ra được interface tương thích với một trong các đối tượng đang có sẵn.
  2. Using this interface, the existing object can safely call the adapter’s methods. (Sử dụng cái interface này, object hiện tại có thể gọi được cái adapter methods)
  3. Upon receiving a call, the adapter passes the request to the second object, but in a format and order that the second object expects. (Dự vào cái kết quả nhận được, nó gửi cho object số 2, tất nhiên format thằng 2 hiểu được)
Adapter PatternAdapter Pattern: Nguồn ảnh/Source: Dive Into DESIGN PATTERNS

Về cơ bản thì giải pháp cho vấn đề ta nêu ra ở mục số 2 sẽ như hình trên.

4. Cấu trúc (Structure)

Implement Adapter Pattern sẽ theo nguyên lý composition (đóng gói lại). Adapter sẽ implement interface của một object và đóng gói lại xài cho cái object khác.

Adapter PatternAdapter Pattern: Nguồn ảnh/Source: Dive Into DESIGN PATTERNS

Giải thích 4 thành phần như sau:

  1. Client bao gồm business logic hiện tại
  2. Client Interface thì định nghĩa những protocols hoặc interface nào ta cần theo nếu muốn work với class Client
  3. Services thì bao gồm một số class, methods cần thiết
  4. Adapter là thằng quan trong nhất, work với cả Client Interface và Service. Adapter sẽ được call từ client thông qua Adapter Interface, chuyển đổi nó làm sao cho thằng Service nó hiểu được.

Còn một điểm nữa liên quan tới Adapter.

Nếu sử dụng đa kế thừa (multiple inheritance) thì thằng adapter sẽ kế thừa interface từ cả hai objects ở cùng một lúc. Tuy nhiên anh em chú ý là nó chỉ khả thi ở những ngôn ngữ cho phép đa kế thừa như C++ thôi nha.

Adapter Pattern: Nguồn ảnh/Source: Dive Into DESIGN PATTERNS

5. Ưu và nhược điểm

Về ưu điểm thì Adapter có hai ưu điểm chính:

Single Responsibility Principle. You can separate the interface or data conversion code from the primary business logic of the program.

Thứ nhất là chữ nguyên lý Single Responsibility: Ta có thể chia các interfaces hoặc code từ luồng business chính ra thành các logic nhỏ, sau đó kết nối lại với nhau bằng Adapter Pattern.

Open/Closed Principle. You can introduce new types of adapters into the program without breaking the existing client code, as long as they work with the adapters through the client interface.

Chữ O trong SOLID, với Adapter Pattern ta có thể kết nối các phần code với nhau mà không cần thêm/xoá sửa gì code cũ. Open cho Extension mà đóng cho Modification. Quá hợp lý!

Về nhược điểm thì đôi khi ta cần cân nhắc kĩ độ phức tạp hoặc tính khả thi khi áp dụng Adapter Pattern. Và nếu project đi theo một thể thống nhất thì vẫn hợp lý hơn.

6. Tham khảo

Wish you and your family all the best – Thank you so much for your time – Happy coding!

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm công việc CNTT hấp dẫn trên TopDev