수색…


소개

구조 디자인 패턴은 개체와 클래스를 결합하여 큰 구조를 형성하는 방법을 설명하고 엔터티 간의 관계를 실현하는 간단한 방법을 식별하여 디자인을 쉽게하는 패턴입니다. 설명 된 7 가지 구조 패턴이 있습니다. 그들은 다음과 같습니다 : 어댑터, 다리, 합성물, 데코레이터, 외관, 플라이급 및 프록시

어댑터 디자인 패턴

이름에서 알 수 있듯이 "어댑터" 는 서로 호환되지 않는 두 개의 인터페이스가 서로 통신 할 수있게하는 객체입니다.

예를 들면 : 아이폰 8 (또는 다른 애플 제품)을 사면 많은 어댑터가 필요하다. 기본 인터페이스는 오디오 jac 또는 USB를 지원하지 않기 때문입니다. 이러한 어댑터를 사용하면 이어폰을 전선과 함께 사용하거나 일반 이더넷 케이블을 사용할 수 있습니다. 따라서 "서로 호환되지 않는 두 인터페이스가 서로 통신합니다" .

기술적 측면에서 이것은 다음을 의미합니다 : 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변환하십시오. 어댑터는 호환되지 않는 인터페이스 때문에 달리 작동 할 수없는 클래스를 함께 작동시킵니다. 이 패턴에 참여하는 클래스와 객체는 다음과 같습니다.

어댑터 패턴은 4 개의 요소를 종료합니다.

  1. ITarget : 이것은 클라이언트가 기능을 달성하기 위해 사용하는 인터페이스입니다.
  2. Adaptee : 이것은 클라이언트가 바라는 기능이지만 인터페이스는 클라이언트와 호환되지 않습니다.
  3. 클라이언트 : 이것은 적응 코드를 사용하여 일부 기능을 구현하고자하는 클래스입니다.
  4. 어댑터 : ITarget을 구현할 클래스이며 클라이언트가 호출하고자하는 Adaptee 코드를 호출합니다.

UML

여기에 이미지 설명을 입력하십시오.

첫 번째 코드 예제 (이론적 인 예) .

public interface ITarget
{
    void MethodA();
}

public class Adaptee
{
    public void MethodB()
    {
        Console.WriteLine("MethodB() is called");
    }
}

public class Client
{
    private ITarget target;

    public Client(ITarget target)
    {
        this.target = target;
    }

    public void MakeRequest()
    {
        target.MethodA();
    }
}  

public class Adapter : Adaptee, ITarget
{
    public void MethodA()
    {
        MethodB();
    }
}

두 번째 코드 예제 (실제 세계 구현)

/// <summary>
///  Interface: This is the interface which is used by the client to achieve functionality.
/// </summary>
public interface ITarget
{
    List<string> GetEmployeeList();
}

/// <summary>
/// Adaptee: This is the functionality which the client desires but its interface is not compatible with the client.
/// </summary>
public class CompanyEmplyees
{
    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;
    }
}

/// <summary>
/// Client: This is the class which wants to achieve some functionality by using the adaptee’s code (list of employees).
/// </summary>
public class ThirdPartyBillingSystem
{
    /* 
     * This class is from a thirt party and you do'n have any control over it. 
     * But it requires a Emplyee list to do its work
     */

    private ITarget employeeSource;

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

    public void ShowEmployeeList()
    {
        // call the clietn list in the interface
        List<string> employee = employeeSource.GetEmployeeList();

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

    }
}

/// <summary>
/// Adapter: This is the class which would implement ITarget and would call the Adaptee code which the client wants to call.
/// </summary>
public class EmployeeAdapter : CompanyEmplyees, ITarget
{
    public List<string> GetEmployeeList()
    {
        List<string> employeeList = new List<string>();
        string[][] employees = GetEmployees();
        foreach (string[] employee in employees)
        {
            employeeList.Add(employee[0]);
            employeeList.Add(",");
            employeeList.Add(employee[1]);
            employeeList.Add(",");
            employeeList.Add(employee[2]);
            employeeList.Add("\n");
        }

        return employeeList;
    }
}

/// 
/// Demo
/// 
class Programs
{
    static void Main(string[] args)
    {
        ITarget Itarget = new EmployeeAdapter();
        ThirdPartyBillingSystem client = new ThirdPartyBillingSystem(Itarget);
        client.ShowEmployeeList();
        Console.ReadKey();
    }
}

언제 사용 하는가?

  • 시스템이 다른 시스템의 클래스와 호환되지 않는 클래스를 사용할 수있게하십시오.
  • 서로 독립적 인 기존 시스템과 기존 시스템 간의 통신을 허용합니다.
  • Ado.Net SqlAdapter, OracleAdapter, MySqlAdapter는 어댑터 패턴의 가장 좋은 예입니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow