[Design Pattern] 12. Adapter Pattern(어댑터 패턴) C#
서로 다른 인터페이스를 변환하여 호환되지 않는 클래스와 작동할 수 있도록 도와주는 패턴입니다.
구조 패턴(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를 만들어 애댑터를 넣고 그려줍니다.
그러면 원하는대로 출력 됨을 확인 하실 수 있습니다.
호환되지않는 인터페이스를 호환시켜 사용한다는 점이 기존 라이브러리에서 호환되지 않은걸 쓰거나 수정하면 안되는 부분을 다른 클래스와 호환시킬때 사용할 수 있어 자주 사용되는 패턴입니다.
잘 알아두시고 사용하시면 좋겠습니다.