카테고리 : 구조 패턴(Structural Pattern)
개요 : Apater 패턴은 기존 라이브러리/시스템의 기능을 사용하고자 할 때, 그 인터페이스가 현재 시스템과 맞지 않을 때, 중간 Adapter 인터페이스를 통해 여러 다양한 시스템들을 바꿔가며, 사용하고자 할 때 사용됨
즉, 현재 시스템과 사용하고자 하는 시스템 간의 호환되지 않는 인터페이스를 중간에 Adapter 인터페이스를 사용하여 연결해 주는 디자인 방식이다.
기존 클래스의 코드를 수정하지 않으며, 다른 클래스와 연동해서 사용할 수 있도록 사용하는 곳에 사용됨
예를 들어 C타입 충전기를 7-pin이나 5-pin 기기와 연결하려면 변환해주는 어뎁터가 필요하다 ㅇ이러한 어뎁터를 사용한다면, 따로 충전기를 구매하지 않아도 사용이 가능하게 된다.
레거시 클래스들을 클라이언트가 요구하는 인터페이스와 맞지 않을 때, Adapter 인터페이스를 통해서
기존 클래스들을 사용할 수 있다.
Adapter 패턴은 크게 Object Adapter Pattern과 Class Adapter Pattern 으로 구분된다.
Object Adapter Pattern : Adapter 클래스가 Adaptee 객체를 자신의 멤버로 내포하는 Composition 방식
코드 예시
namespace Adapter
{
internal class Program
{
static void Main(string[] args)
{
Client.Operation();
}
public class Adaptee
{
public void AdapteeRequest()
{
}
}
public class Adapter
{
private Adaptee adaptee = new Adaptee();
public void Request()
{
adaptee.AdapteeRequest();
}
}
public class Client
{
public static void Operation()
{
Adapter adapter = new Adapter();
adapter.Request();
}
}
}
}
Object Adapter Pattern의 하나의 예제로서, HDMI를 가진 컴퓨터에서 VGA 모니터에 출력하기 위해 HDMI-VGA 변환을 수행하는 어댑터 변환을 수행하는 가상의 시나리오를 표현한 예제이다.
namespace HdmiToVgaAdapter
{
class Program
{
static void Main(string[] args)
{
Client client = new Client();
client.HowTouse();
}
public interface IAdapter
{
void Display(byte[] data);
}
// Adapter 클래스
public class HdmiToVgaAdapter : IAdapter
{
private LegacyVGA vga = new LegacyVGA();
public void Display(byte[] data)
{
// convert to vga...
vga.Display(data);
}
}
// Adaptee 클래스
public class LegacyVGA
{
public void Display(byte[] data) { }
}
// 기타
public class HdmiAdapter : IAdapter
{
public void Display(byte[] data) { }
}
//클라이언트
class Client
{
private bool vgaMonitor = true;
public void HowTouse()
{
IAdapter hdmi;
if (vgaMonitor)
{
hdmi = new HdmiToVgaAdapter();
}
else
{
hdmi = new HdmiAdapter();
}
var data = new byte[] { /* ... */ };
DisplayData(hdmi, data);
}
public void DisplayData(IAdapter adapter, byte[] data)
{ adapter.Display(data); }
}
}
}
Class Adapter Pattern : Adapter 클래스가 상속을 통해 클라이언트와 Adaptee 간의 불일치 문제를 해결
Class Adapter Pattern 패턴은 Adapter 클래스가 Target과 Adaptee 클래스를 상속해서 Adapter를 구현하는 방식이다. C++와 같은 언어는 복수의 클래스들로부터 상소갛는 다중 상속이 가능하지만, C#을 비롯한 많은 언어가 다중상속을 지원하지 않으므로, Target 클래스가 아닌 인터페이스로 만들고 Adaptee 클래스를 상속하며 Target 인터페이스를 구하여 사용함
namespace Class_Adapter_Pattern
{
internal class Program
{
static void Main(string[] args)
{
Clinet cls = new Clinet();
cls.Operation();
}
}
public class Clinet
{
private ITarget target;
public void Operation()
{
target.Request();
}
}
public interface ITarget
{
void Request();
}
public class Adaptee
{
public void AdapteeRequest()
{
}
}
public class Adapter : Adaptee, ITarget
{
public void Request() { }
}
}
'C# 이것저것 > C# 디자인패턴' 카테고리의 다른 글
[C#] Proxy 패턴 (0) | 2024.04.15 |
---|---|
[C#] Decorator 패턴 (0) | 2024.04.15 |
[C#] Bridge 패턴 (0) | 2024.04.06 |
[C#] Object Pool 패턴 (0) | 2024.03.31 |