1. Adapter Pattern là gì?

Adapter (Người chuyển đổi) Pattern là một trong những Pattern thuộc nhóm cấu trúc (Structural Pattern). Adapter Pattern cho phép các inteface (giao diện) không liên quan tới nhau có thể làm việc cùng nhau. Đối tượng giúp kết nối các interface gọi là Adapter.

Ví dụ cái phích cắm điện có 3 chân nhưng ổ điện chỉ có 2 lỗ thì phải dùng thêm 1 cái bộ chuyển để chuyển từ 3 chân sang 2 chân – bộ chuyển này cũng được gọi là Adapter.

2. Cấu trúc

3. Sử dụng Adapter Pattern khi nào?

  • Khi ta muốn chuyển đổi một lớp với một giao diện thành giao diện mà ta mong muốn.
  • Xây dựng, mở rộng các phương thức của lớp có sẵn phù hợp với yêu cầu.
  • Tái sử dụng giao diện cũ. Giảm thiểu việc viết lại code.

4. Cách triển khai và code ví dụ

using System;

namespace DesignPatternAdapter
{
    // Interface phía client muốn sử dụng
    public interface ITarget
    {
        string GetRequest();
    }

    // Class hiện tại không tương thích với interface phía client.
    // Vì vậy, cần phải qua một class Adapter để phía Client 
    // có thể gọi được
    class Adaptee
    {
        public string GetSpecificRequest()
        {
            return "Specific request.";
        }
    }

    // Class chuyển đổi để client có thể gọi được method GetSpecificRequest()
    // của class Adaptee thông qua method GetRequest() của phía client
    class Adapter : ITarget
    {
        private readonly Adaptee _adaptee;

        public Adapter(Adaptee adaptee)
        {
            this._adaptee = adaptee;
        }

        public string GetRequest()
        {
            return $"This is '{this._adaptee.GetSpecificRequest()}'";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Adaptee adaptee = new Adaptee();
            ITarget target = new Adapter(adaptee);

            // Adaptee không tương thích với giao diện phía Client.
            // Nhưng với class Adapter thì phía Client có thể gọi được 
            // method của Adaptee.

            Console.WriteLine(target.GetRequest());

            Console.ReadKey();
        }
    }
}