CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Tìm hiểu Adapter Design Pattern với ví dụ sử dụng ngôn ngữ C#

Đăng lúc: 05:03 PM - 30/11/2022 bởi Charles Chung - 797

Adapter là một mẫu thuộc nhóm Structures Pattern, nó cho phép các đối tượng có giao diện không tương thích cộng tác với nhau.

1. Vai trò của adapter pattern 

Adapter hoạt động như một trình bao bọc giữa hai đối tượng. Nó bắt các lệnh gọi một đối tượng và chuyển chúng sang định dạng và giao diện được đối tượng thứ hai nhận dạng, giống như ngoài đời thực là bộ chuyển đổi để ô tô có thể chạy trên đường ray của tàu hỏa hoặc chạy như xuồng dưới sông.

2. Đặt vấn đề

Hãy tưởng tượng rằng bạn đang tạo một ứng dụng theo dõi thị trường chứng khoán. Ứng dụng tải xuống dữ liệu kho từ nhiều nguồn ở định dạng XML và sau đó hiển thị các biểu đồ và sơ đồ đẹp mắt cho người dùng.Tại một số thời điểm, bạn quyết định cải thiện ứng dụng bằng cách tích hợp thư viện phân tích của bên thứ 3 thông minh. Nhưng có một điểm lưu ý: thư viện phân tích chỉ hoạt động với dữ liệu ở định dạng JSON. Bạn có thể thay đổi thư viện để hoạt động với XML. Tuy nhiên, điều này có thể phá vỡ một số mã hiện có dựa trên thư viện. Và tệ hơn nữa, bạn có thể không có quyền truy cập vào mã nguồn của thư viện ngay từ đầu, khiến cho phương pháp này không thể thực hiện được.

alt text

3. Giải pháp

Bạn có thể tạo một bộ chuyển đổi. Đây là một đối tượng đặc biệt dùng để chuyển đổi giao diện của một đối tượng để đối tượng khác có thể hiểu được. Bộ điều hợp bao bọc một trong các đối tượng để che giấu sự phức tạp của quá trình chuyển đổi diễn ra ở hậu trường. Đối tượng được bọc thậm chí không biết về bộ điều hợp. Ví dụ: bạn có thể bọc một đối tượng hoạt động theo đơn vị mét và kilômét bằng một bộ điều hợp chuyển đổi tất cả dữ liệu sang các đơn vị hệ thống đo lường Anh như feet và dặm. Bộ điều hợp không chỉ có thể chuyển đổi dữ liệu thành nhiều định dạng khác nhau mà còn có thể giúp các đối tượng có giao diện khác nhau cộng tác với nhau. Đây là cách nó hoạt động:

  • Bộ điều hợp có một giao diện, tương thích với một trong các đối tượng hiện có.
  • Sử dụng giao diện này, đối tượng hiện có có thể gọi các phương thức của bộ điều hợp một cách an toàn.
  • Khi nhận được cuộc gọi, bộ điều hợp chuyển yêu cầu đến đối tượng thứ hai, nhưng ở định dạng và thứ tự mà đối tượng thứ hai mong đợi.

Đôi khi, thậm chí có thể tạo bộ điều hợp hai chiều có thể chuyển đổi cuộc gọi theo cả hai hướng.

alt text

 

4. Các thành phần của Adapter

alt text

  • Client: Làm việc trực tiếp qua Target interface.
  • Target: Đây là một interface và nó cần được thực thi bởi Adapter. Chỉ có Client có thể thấy interface này.
  • Adapter: Có chức năng kết nối hai hệ thống không tương thích hoạt động cùng nhau.
  • Adaptee: Class này chứa chức năng mà ứng dụng yêu cầu, nhưng nó không tương thích với code client hiện có. Vì vây, nó yêu cầu một số điều chỉnh trước khi code client có thể sử dụng nó.

5. Ví dụ demo C#

Tệp Employee.cs

/// <summary>
    /// Data class: lớp dữ liệu
    /// </summary>
    public class Employee
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Role { get; set; }
        public override string ToString()
        {
            return String.Format("{0},{1},{2}\n", Id, Name, Role);
        }
    }

Tệp HRSystem.cs

/// <summary>
    /// Adaptee class : xử lý nghiệp vụ cung cấp dữ liệu đầu vào
    /// </summary>
    public class HRSystem
    {
        public string[][] GetEmployees()
        {
            string[][] employees = new string[4][];

            employees[0] = new string[] { "100", "Deepak", "Team Leader" };
            employees[1] = new string[] { "101", "Rohit", "Developer" };
            employees[2] = new string[] { "102", "Gautam", "Developer" };
            employees[3] = new string[] { "103", "Dev", "Tester" };

            return employees;
        }
    }

Tệp ITarget.cs

/// <summary>
    /// ITarget: giao diện chuyển đổi
    /// </summary>
    public interface ITarget
    {
        List<Employee> GetEmployeeList();
    }

Tệp EmployeeAdapter.cs

/// <summary>
    /// Adapter class: Chuyển đổi mảng Employee thành List employee
    /// </summary>
    public class EmployeeAdapter : HRSystem, ITarget
    {
        public List<Employee> GetEmployeeList()
        {
            List<Employee> employeeList = new List<Employee>();
            string[][] employees = GetEmployees();
            foreach (string[] emp in employees)
            {
                employeeList.Add(new Employee { Id = emp[0], Name = emp[1], Role = emp[2] });
            }
            return employeeList;
        }
    }

Tệp ThirdPartyBillingSystem.cs

/// <summary>
    /// Client class
    /// Hiển thị kết quả đầu ra sau khi chuyển đổi
    /// </summary>
    public class ThirdPartyBillingSystem
    {
        private ITarget employeeSource;

        public ThirdPartyBillingSystem(ITarget employeeSource)
        {
            this.employeeSource = employeeSource;
        }

        public void ShowEmployeeList()
        {
            List<Employee> employee = employeeSource.GetEmployeeList();

            Console.WriteLine("######### Employee List ##########");
            foreach (var item in employee)
            {
                Console.Write(item);
            }

        }
    }

Tệp Program.cs

/// <summary>
    /// Chương trình chính
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            ITarget Itarget = new EmployeeAdapter();
            ThirdPartyBillingSystem client = new ThirdPartyBillingSystem(Itarget);
            client.ShowEmployeeList();
        }
    }

Link tải source code (Google Drive)

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ