Adapter Design Pattern là một trong những mẫu thiết kế cấu trúc (structural design pattern) trong lập trình phần mềm. Mục tiêu chính của nó là cho phép các đối tượng có các giao diện không tương thích làm việc cùng nhau thông qua một lớp trung gian gọi là Adapter.

Mô hình Adapter thường được sử dụng khi bạn muốn sử dụng một lớp có sẵn nhưng giao diện của nó không tương thích với những gì bạn cần. Thay vì thay đổi mã nguồn của lớp đó, bạn có thể tạo một lớp trung gian (Adapter) để chuyển đổi giao diện của nó thành một giao diện mà bạn mong muốn.

Một số thành phần chính của Adapter Pattern:

  1. Target: Đây là giao diện mà client sử dụng để gọi các phương thức cụ thể.
  2. Adapter: Là lớp trung gian, thực hiện giao diện Target và chứa một tham chiếu tới đối tượng mà nó chuyển đổi (Adaptee).
  3. Adaptee: Là lớp mà Adapter sẽ chuyển đổi.

Adapter Pattern có hai loại:

Giả sử chúng ta có một hệ thống quản lý nhân viên, trong đó chúng ta đã có một giao diện Employee:

interface Employee {
    val id: Int
    val firstName: String
    val lastName: String
    val email: String
}

Chúng ta cũng có một lớp EmployeeService để thao tác với những đối tượng Employee:

class EmployeeService {
    fun displayEmployee(employee: Employee) {
        println("Employee ID: ${employee.id}")
        println("Name: ${employee.firstName} ${employee.lastName}")
        println("Email: ${employee.email}")
    }
}

Bây giờ, giả sử chúng ta muốn tích hợp một loại đối tượng mới là Customer, nhưng nó không cùng giao diện với Employee. Chúng ta có thể sử dụng Adapter Pattern để chuyển đổi giao diện của Customer thành Employee.

Đầu tiên, chúng ta định nghĩa giao diện Customer:

interface Customer {
    val customerId: Int
    val firstName: String
    val lastName: String
    val email: String
}

Tiếp theo, chúng ta triển khai một lớp Adapter để chuyển đổi Customer thành Employee:

class CustomerAdapter(private val customer: Customer) : Employee {
    override val id: Int
        get() = customer.customerId

    override val firstName: String
        get() = customer.firstName

    override val lastName: String
        get() = customer.lastName

    override val email: String
        get() = customer.email
}

Cuối cùng, chúng ta có thể sử dụng EmployeeService để hiển thị thông tin của một đối tượng Customer nhưng bằng cách sử dụng Adapter:

fun main() {
    val customer: Customer = object : Customer {
        override val customerId: Int = 101
        override val firstName: String = "John"
        override val lastName: String = "Doe"
        override val email: String = "[email protected]"
    }

    val employeeService = EmployeeService()
    val customerAdapter = CustomerAdapter(customer)

    employeeService.displayEmployee(customerAdapter)
}