목차
어댑터(Adapter)
어댑터 디자인 패턴(Adapter Design Pattern)은 두 개의 호환되지 않는 인터페이스 사이에 다리를 놓는 디자인 패턴이다. 이 패턴은 한 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변환한다. 클라이언트에서는 변환된 인터페이스를 사용하여 기존 클래스를 사용할 수 있게 된다. 이러한 방식으로 어댑터는 기존 코드를 변경하지 않고도 새로운 인터페이스와 기존 인터페이스 간의 호환성 문제를 해결한다.
패턴명인 '어댑터'는 일상 생활에서 사용하는 전기 어댑터에서 유래했다. 전기 어댑터는 한 국가의 전기 플러그가 다른 국가의 콘센트와 맞지 않을 때, 두 전기 시스템 간의 호환성을 제공한다. 마찬가지로, 어댑터 디자인 패턴도 서로 호환되지 않는 인터페이스 간의 연결고리 역할을 한다.
패턴 미적용 예시
예를 들어, 어떤 시스템에서 IMessageSender 인터페이스를 통해 메시지를 전송하는 기능을 제공하고, EmailSender 클래스가 이 인터페이스를 구현하도록 한다고 가정하자. 그러나 나중에, 시스템에 SMS 메시지를 전송해야 하는 새로운 요구사항이 생겼으나 SMS 전송 클래스가 IMessageSender 인터페이스를 구현하지 않는다면, 기존 코드는 SMS 전송 기능을 사용할 수 없게 된다.
// IMessageSender 인터페이스와 EmailSender 클래스
public interface IMessageSender
{
void Send(string message);
}
public class EmailSender : IMessageSender
{
public void Send(string message)
{
// 이메일을 전송하는 로직
Console.WriteLine($"Email: {message}");
}
}
// SMS 전송을 담당하지만 IMessageSender 인터페이스를 구현하지 않는 클래스
public class SMSSender
{
public void SendSMS(string message)
{
// SMS를 전송하는 로직
Console.WriteLine($"SMS: {message}");
}
}
public class Notification
{
private IMessageSender _messageSender;
public Notification(IMessageSender messageSender)
{
_messageSender = messageSender;
}
public void SendNotification(string message)
{
_messageSender.Send(message);
}
}
이 경우, SMSSender 클래스는 IMessageSender 인터페이스를 구현하지 않으므로, Notification 클래스는 SMSSender 를 사용하여 SMS 메시지를 전송할 수 없다.
패턴 적용 예시
using System;
// IMessageSender 인터페이스와 EmailSender 클래스
public interface IMessageSender
{
void Send(string message);
}
public class EmailSender : IMessageSender
{
public void Send(string message)
{
// 이메일을 전송하는 로직
Console.WriteLine($"Email: {message}");
}
}
// SMS 전송을 담당하지만 IMessageSender 인터페이스를 구현하지 않는 클래스
public class SMSSender
{
public void SendSMS(string message)
{
// SMS를 전송하는 로직
Console.WriteLine($"SMS: {message}");
}
}
// SMS 메시지 전송을 위한 어댑터 클래스
public class SMSAdapter : IMessageSender
{
private SMSSender _smsSender;
public SMSAdapter(SMSSender smsSender)
{
_smsSender = smsSender;
}
public void Send(string message)
{
_smsSender.SendSMS(message);
}
}
public class Notification
{
private IMessageSender _messageSender;
public Notification(IMessageSender messageSender)
{
_messageSender = messageSender;
}
public void SendNotification(string message)
{
_messageSender.Send(message);
}
}
public class Program
{
public static void Main(string[] args)
{
IMessageSender emailSender = new EmailSender();
Notification emailNotification = new Notification(emailSender);
emailNotification.SendNotification("이메일 메시지");
SMSSender smsSender = new SMSSender();
IMessageSender smsAdapter = new SMSAdapter(smsSender);
Notification smsNotification = new Notification(smsAdapter);
smsNotification.SendNotification("SMS 메시지");
}
}
위 코드는 IMessageSender 인터페이스와 이를 구현하는 EmailSender 클래스, 그리고 IMessageSender 인터페이스를 구현하지 않은 SMSSender 클래스를 포함한다. SMSSender 클래스를 시스템에 통합하기 위해 SMSAdapter 클래스를 어댑터로 사용하여 IMessageSender 인터페이스를 구현하게 한다. 이를 통해 Notification 클래스는 이메일과 SMS 모두를 메시지 전송 수단으로 사용할 수 있게 된다.
제공한 코드는 어댑터 패턴의 전체적인 적용 과정을 보여준다. 이러한 방식으로, 기존 시스템의 코드를 변경하지 않고도 새로운 기능을 쉽게 추가할 수 있다는 장점을 가지고 있다.
'컴퓨터 과학 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 구조 패턴(3) : 프록시(Proxy) (2) | 2024.03.24 |
---|---|
[디자인패턴] 구조 패턴(2) : 컴포지트(Composite) (1) | 2024.03.24 |
[디자인패턴] 생성 패턴(6) : 싱글톤(Singleton) (0) | 2024.03.24 |
[디자인패턴] 생성 패턴(5) : 프로토타입(Prototype) (0) | 2024.03.24 |
[디자인패턴] 생성 패턴(4) : 빌더(Builder) (0) | 2024.03.24 |