Jacobvu84 / design-pattern

0 stars 0 forks source link

Adapter or Wrapper #1

Open Jacobvu84 opened 1 week ago

Jacobvu84 commented 1 week ago

Tình huống trong thực tế

Bạn đang sở hữu một chiếc xe điện VinFast trên đất Mỹ và bạn muốn dùng cổng sạc của Tesla nhưng phích cắm (plug) trên xe VF không tương thích với các cổng sạc (charging port ) của Tesla.

Hoặc bạn mua các thiết bị điện tử ở nước ngoài nhưng ổ cắm của thiết bị điện tử này lại không khớp, không tương thích với các cổng (port) trên ổ cắm.

image

Vấn đề

Làm sao để có thể sạc điện xe VF ở những cổng sạc của các hãng xe điện khác.

Đương nhiên là mọi thứ sẽ phức tạp nó làm ảnh hưởng đến những hoạt động thương mại mà cả 2 hãng đã xây dựng trước đó và tốn kém nữa, trừ khi là hai hãng xe này ngồi với nhau và đề ra một tiêu chuẩn mang tính quốc tế.

Giải pháp

Điều chúng ta cần là một bộ phận có thể bộ chuyển đổi trung gian. Làm cho giao diện của Plug sao cho tương thích với giao diện của cổng sạc. Cái này gọi là Adapter.

Bộ Phận có chức năng chuyển đổi giao diện này được gọi là Adapter. Nó sẽ giúp cho các đối tượng không tương thích, không khớp về mặt giao diện có thể làm việc được với nhau.

Trong lĩnh vực phần mềm, Adapter là một dạng design pattern thuộc nhóm Structural. Nó cho phép interface của một class đã tồn tại được sử dụng như là một giao diện khác. Điều này giúp nó có thể làm việc với các class khác mà không cần thay đổi lại mã nguồn. Nó đóng vai trò như một "người phiên dịch" giữa hai giao diện không tương thích.

Design này phù hợp với mô hình micro-services.

image

Nguồn tham khảo

Jacobvu84 commented 1 week ago

Ví dụ

Đây là Target mà power plug của Vinfast cần phải làm cho giống để tương thích với các port charging của Tesla. Để cắm vào được trụ sạc của Tesla thì Plug cần có hình vuông.

public interface TeslaPlug {

    void squareConnect();
}

Plug của VinFast chỉ có thể cắm vào cổng sạc của VinFast với tiết diện hình tròn.

public class VinFast {

    public void cirleConnect() {
        System.out.println("VinFast plug connected.");
    }
}

Hiện tại ổ cắm của Tesla là hình vuông, còn VinFast là hình tròn nên không thể dùng phích cắm của VinFast sạc điện ở trụ sạc của Tesla được.

Chế tạo bộ chuyển đổi Plug Adapter

class PlugAdapter implements TeslaPlug {
    private final VinFast vinFast;

    public PlugAdapter(VinFast vinFast) {
        this.vinFast = vinFast;
    }

    @Override
    public void squareConnect() {
        vinFast.cirleConnect();
    }
}

Và khách hàng sẽ sử dụng

        VinFast vinFast = new VinFast();

        TeslaPlug adapter = new PlugAdapter(vinFast);

        adapter.squareConnect();
Jacobvu84 commented 1 week ago

Ưu điểm Giúp các lớp có giao diện không tương thích có thể làm việc cùng nhau. Giảm sự phụ thuộc vào các lớp cụ thể. Nhược điểm Có thể làm tăng độ phức tạp của hệ thống khi có nhiều Adapter.