Thắc mắc về Adapter pattern

Chào mọi người, mình đang thắc mắc bài toán sau:

  • Một công ty sử dụng dịch vụ XPay để thanh toán qua mạng. XPay gồm các thông tin: tên khách hàng(customerName), số thẻ(creditCardNo), tháng hết hạn(cardExpMonth), năm hết hạn(cardExpYear), số CVV(cardCVVNo), lượng tiền khách hàng phải trả(amount).

  • Giờ công ty muốn đổi sang dùng PayD. Tuy nhiên, PayD không tương tích với XPay và PayD chỉ cho phép sử dụng các đối tượng kiểu PayD. Thông tin PayD: mã số thẻ(customerCardNo), tên chủ thẻ(cardOwnerName), ngày hết hạn(cardExpMonthDate), số CVV(cardCVVNo), tổng tiền(totalAmount)

  • Áp dụng Apdater để khắc phục và vẫn giữ nguyên những gì liên quan đến XPay.

Mình chưa hình dung được vấn đề và cần một vài bộ test để hiểu. Ai có thể giúp mình với! cảm ơn!

Là lớp hỗ trợ điều hợp giữa XPay và PayD thôi. Nói dễ hiểu là nó chuyển đổi đối tượng từ XPay về đối tượng PayD.
Vd cho Adapter:

class Adapter{
    public static PayD XPay2PayD(Xpay in){
        // Thực hiện chuyển các trường tương ứng từ XPay về PayD
        // PayD = XPay
        // customerCardNo = creditCardNo
        // cardOwnerName = customerName
        // cardExpMonthDate = cardExpMonth + cardExpYear
        // cardCVVNo = cardCVVNo
        // totalAmount = amount
        PayD out = new PayD(...);
        return out;
    }
}

5 Likes

Tôi xin bổ sung thêm một chút:

Mục đích của Adapter pattern là xây dựng các lớp trung gian để làm cho các lớp có sẵn có thể hoạt động với các lớp mới mà không cần phải thay đổi chúng.

Các ứng dụng về adapter trong thực tế dễ thấy nhất là các loại giắc chuyển đổi (dongle). Ví dụ như bạn có một cái headphone đời cũ không hỗ trợ bluetooth mà chỉ có dây 3.5mm. Headphone này hoạt động tốt với điện thoại cũ của bạn vì có giắc 3.5mm. Nhưng khi bạn dùng một phone khác mới hơn chỉ có chỗ cho khe USB mà không có chỗ để gắn dây nghe thì làm sao? Bạn phải dùng một giắc chuyển đổi (dongle) từ USB sang 3.5mm phải không? Dongle trong trường hợp này chính là một adapter vì nó cho phép bạn dùng headphone cũ của bạn với khe USB mà bạn không cần phải mua headphone mới hay chỉnh sửa headphone hiện tại của bạn.

Trở lại bài tập của bạn, ban đầu ta có sơ đồ này:

image

Để đáp ứng yêu cầu của đề bài, ta phải xây dựng lớp Adapter sao cho đầu vào vẫn là thông tin khách hàng cho XPay, nhưng lại sử dụng được với PayD như sơ đồ sau:

image

Phần implematation thì như bạn @SITUVN.gcd đã giải thích.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?