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!
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.
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.
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.
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?
- 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.
- 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)
- 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)
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.
Giải thích 4 thành phần như sau:
- Client bao gồm business logic hiện tại
- 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
- Services thì bao gồm một số class, methods cần thiết
- 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.
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
- Mediator Design Pattern – Collaborate via me
- Prototype pattern – một trong những pattern phổ biến nhất
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:
- React Props Cheatsheet: 10 Patterns mà bạn nên biết (Phần 2)
- React Props Cheatsheet: 10 Patterns mà bạn nên biết (Phần 1)
- Các loại Design patterns
Xem thêm công việc CNTT hấp dẫn trên TopDev
- B BenQ RD Series – Dòng Màn Hình Lập Trình 4k+ Đầu Tiên Trên Thế Giới
- i iOS 18 có gì mới? Có nên cập nhật iOS 18 cho iPhone của bạn?
- G Gamma AI là gì? Cách tạo slide chuyên nghiệp chỉ trong vài phút
- P Power BI là gì? Vì sao doanh nghiệp nên sử dụng PBI?
- K KICC HCMC x TOPDEV – Bước đệm nâng tầm sự nghiệp cho nhân tài IT Việt Nam
- T Trello là gì? Cách sử dụng Trello để quản lý công việc
- T TOP 10 SỰ KIỆN CÔNG NGHỆ THƯỜNG NIÊN KHÔNG NÊN BỎ LỠ
- T Tìm hiểu Laptop AI – So sánh Laptop AI với Laptop thường
- M MySQL vs MS SQL Server: Phân biệt hai RDBMS phổ biến nhất
- S SearchGPT là gì? Công cụ tìm kiếm mới có thể đánh bại Google?