Design Pattern

[Design Pattern] 12. Adapter Pattern(어댑터 패턴) C#

o0zrone 2023. 4. 1. 23:45
728x90

서로 다른 인터페이스를 변환하여 호환되지 않는 클래스와 작동할 수 있도록 도와주는 패턴입니다.

 

구조 패턴(Structural Design Patterns)중 하나이죠.

 

장점

  • 단일 책임 원칙을 만족하며 인터페이스 또는 데이터 변환 코드를 분리할 수 있습니다.
  • 개방/폐쇄 원칙을 만족하며 인터페이스를 통해 어댑터와 작동한다면 기존의 코드를 변경하지 않고 새로운 어댑터를 추가할 수 있습니다.

단점

  • 많은 새로운 인터페이스와 클래스를 만들어야 하므로 복잡성이 증가합니다.

 

C#으로 Console 프로젝트를 하나 생성해서 할 것입니다.

 

목표는 호환되지 않는 사각형(Legacy)을 어댑터에 넣고 Client에서 그려보도록 하겠습니다.

 

프로젝트의 tree구조는 아래와 같습니다.

Adapter(Project)

|- Program.cs (Main)

|- LegacyRectangle.cs (Adaptee)

|- IRectangle.cs (Target)

|- RectangleAdapter.cs (Adapter)

|- Client.cs (Client)

 

 

IRectangle.cs

namespace Adapter
{
    public interface IRectangle
    {
        int Width { get; }
        int Height { get; }
    }
}

 

 

사각형 정보인 높이와 너비 필드를 구성해줍니다.

 

 

RectangleAdapter.cs

namespace Adapter
{
    public class RectangleAdapter : IRectangle
    {
        private readonly LegacyRectangle _legacyRectangle;

        public RectangleAdapter(LegacyRectangle legacyRectangle)
        {
            _legacyRectangle = legacyRectangle;
        }

        public int Width
        {
            get { return _legacyRectangle.GetWidth(); }
        }

        public int Height
        {
            get { return _legacyRectangle.GetHeight(); }
        }
    }
}

Adapter에 연결시킬 호환되지 않는 Legacy Rectangle을 입력받아 출력할 수 있도록 구현해줍니다.

 

 

LegacyRectangle.cs

namespace Adapter
{
    public class LegacyRectangle
    {
        public int GetWidth()
        {
            return 10;
        }

        public int GetHeight()
        {
            return 20;
        }
    }
}

호환되지 않게 수치를 하드코딩 해줍니다.

 

Client.cs

using System;

namespace Adapter
{
    public class Client
    {
        public void Draw(IRectangle rectangle)
        {
            Console.WriteLine($"Drawing width {rectangle.Width} : height {rectangle.Height}");
        }
    }
}

받은 IRectangle을 그려주는 메소드를 만들어 그려(정보 출력)줍니다.

 

Program.cs

namespace Adapter
{
    class Program
    {
        static void Main(string[] args)
        {
            LegacyRectangle legacyRectangle = new LegacyRectangle();

            RectangleAdapter rectangleAdapter = new RectangleAdapter(legacyRectangle);

            Client client = new Client();

            client.Draw(rectangleAdapter);
        }
    }
}

Legacy Rectangle와 Adapter를 먼저 만들어주고

Client를 만들어 애댑터를 넣고 그려줍니다.

 

그러면 원하는대로 출력 됨을 확인 하실 수 있습니다.

실행 결과

호환되지않는 인터페이스를 호환시켜 사용한다는 점이 기존 라이브러리에서 호환되지 않은걸 쓰거나 수정하면 안되는 부분을 다른 클래스와 호환시킬때 사용할 수 있어 자주 사용되는 패턴입니다.

 

잘 알아두시고 사용하시면 좋겠습니다.