ios

Adapter Pattern [Part1] - Class Adapter

Adapter là gì

Khi sử dụng laptop hay điện thoại chắc hẳn bạn đã biết đến adapter (hay còn gọi là cục sạc), thiết bị giúp chuyển đổi dòng điện xoay chiều điện lưới thành dòng một chiều để máy tính có thể sử dụng được. Trong ngôn ngữ lập trình, Adapter Pattern cũng mang ý nghĩa tương tự như vậy. Bằng cách chuyển đổi interface của một class sang một interface khác mà client mong muốn, Adapter giúp các class có thể tương tác với nhau cho dù không tương thích về mặt interface ( [1], Trang 139). Adapter Pattern bao gồm 2 dạng thức : Class Adapter và Object Adapter. Ở phần 1 của bài viết này, chúng ta hãy cùng tìm hiểu về Class Adapter.

Class Adapter

Trước hết, để giúp bạn dễ dàng hình dung Class Adapter là gì hãy tham khảo sơ đồ UML của Class Adapter ([1], Trang 141) Có một lưu ý nhỏ ở đây, do Objective-C và Swift không hỗ trợ đa kế thừa, nên ta cần chỉnh sửa Target trở thành Protocol chứ không phải là Class như trong sơ đồ ở trên.

Có vẻ như vẫn rất mơ hồ phải không? Hãy trở lại với ví dụ về cục sạc, tương ứng với các thành phần trong sơ đồ trên ta sẽ có:

  1. Client : Laptop hoặc điện thoại của bạn
  2. Target : Nguồn điện
  3. Adapter: Cục sạc
  4. Adaptee: Converter hay bộ biến đổi dòng xoay chiều thành một chiều
// Target
protocol PowerSource {
    func powerOn()
}
// Adaptee
class Converter {
    func convertACToDC() {
        print("Converter: Convert AC to DC")
    }
}
// Adapter
class Adapter : Converter {}
extension Adapter: PowerSource {
    func powerOn() {
        print("PowerSource: Power on")
        convertACToDC()
    }
}
// Client
class MacBook {
    var source: PowerSource?
    init(source: PowerSource) {
        self.source = source
    }
    func charging() {
        source?.powerOn()
        print("MacBook : Charging")
    }
}
// usage
let client = MacBook(source: Adapter())
client.charging()

Và kết quả :

PowerSource: Power on
Converter: Convert AC to DC
MacBook : Charging

Cho dù đoạn code trên mới chỉ dừng lại ở mức nguyên lý, nhưng hy vọng đã giúp bạn có thể hình dung Class Adapter là gì. Phần tiếp theo sẽ cung cấp cho các bạn những ứng dụng thực tế hơn của Adapter Pattern.

Tài liệu tham khảo

[1] Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides - Design Patterns Elements of Reusable Object Oriented Software - Addison Wesley Professional (1994)

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration