어댑터 패턴
어댑터 패턴은 클라이언트 프로그래머에게는 다소 생소한 패턴 중 하나입니다.
회사의 코드를 살펴보니, 실제로 사용하고 있었습니다..
어댑터 패턴은 오래된 인터페이스로 설계된 클래스와 새 인터페이스로 설계된 클래스를 연결하는 패턴입니다.
이 패턴은 복잡하게 들릴 수 있지만, 실제로는 매우 간단합니다.
어댑터 패턴의 목적과 구조
목적
1.
인터페이스 호환성: 어댑터 패턴의 주요 목적은 서로 다른 두 인터페이스를 호환되게 만드는 것입니다. 예를 들어, 유니티에서 서로 다른 라이브러리나 시스템 간의 호환성을 제공합니다.
2.
재사용성 증가: 기존 코드나 라이브러리를 변경하지 않고도 새로운 인터페이스와 통합할 수 있게 해줍니다. 이는 기존 코드의 재사용성을 증가시킵니다.
3.
유연성 향상: 시스템의 유연성을 향상시키며, 추후 변경사항이 생겼을 때 쉽게 대응할 수 있게 해줍니다.
구조
어댑터 패턴의 구조는 글로 설명하면, 너무 어려워서 우선 간단하게 구조를 살펴보고 코드를 살펴보겠습니다.
1. 타겟(Target)
•
역할: 타겟은 클라이언트가 사용하려는 특정 인터페이스를 정의합니다. 이 인터페이스는 클라이언트가 기대하는 메소드를 포함합니다.
•
예시: 유니티 게임 개발에서 타겟은 게임 내에서 사용되는 특정한 오디오 재생 인터페이스일 수 있습니다.
2. 클라이언트(Client)
•
역할: 클라이언트는 타겟 인터페이스를 사용하여 작업을 수행합니다. 이는 일반적으로 타겟 인터페이스를 통해 서비스를 요청하는 객체입니다.
•
예시: 게임 내의 오디오 관리 시스템이 클라이언트가 될 수 있으며, 특정 인터페이스를 통해 오디오를 재생하는 기능을 요청합니다.
3. 어댑터(Adapter)
•
역할: 어댑터는 타겟 인터페이스를 구현하면서 내부적으로 어댑티 인스턴스를 포함합니다. 이는 타겟 인터페이스의 호출을 어댑티의 인터페이스로 변환합니다.
•
예시: 어댑터는 새로운 오디오 시스템 인터페이스를 구현하고, 내부적으로 오래된 오디오 시스템의 인스턴스를 사용하여 요청을 처리합니다.
4. 어댑티(Adaptee)
•
역할: 어댑티는 이미 존재하는 인터페이스로, 어댑터를 통해 타겟 인터페이스와 호환됩니다. 어댑티는 타겟 인터페이스와 다른 인터페이스를 가지고 있습니다.
•
예시: 게임 내에서 이전에 사용되던 오래된 오디오 시스템이 어댑티가 될 수 있습니다.
어댑터 패턴 구현
1. 타겟(Target) - INewAudioSystem
•
역할: 타겟은 클라이언트가 사용하고자 하는 인터페이스입니다. 이 경우, 새로운 오디오 시스템 인터페이스가 타겟이 됩니다.
public interface INewAudioSystem
{
void PlayAudioFile(string path);
// 여러가지 새로운 오디오 시스템 함수
}
C#
복사
2. 클라이언트(Client) - AudioManager
•
역할: 클라이언트는 타겟 인터페이스를 사용하여 작업을 수행하는 객체입니다. 여기서는 AudioManager 클래스가 클라이언트 역할을 합니다.
public class AudioManager
{
private INewAudioSystem audioSystem;
public AudioManager(INewAudioSystem newSystem)
{
audioSystem = newSystem;
}
public void Play(string file)
{
audioSystem.PlayAudioFile(file);
}
}
C#
복사
어댑터(Adapter) - AudioSystemAdapter
•
역할: 어댑터는 타겟 인터페이스를 구현하며, 내부적으로 어댑티(오래된 오디오 시스템)의 인스턴스를 포함합니다. 이 클래스는 타겟 인터페이스의 호출을 어댑티의 인터페이스로 변환합니다.
public class AudioSystemAdapter : INewAudioSystem
{
private IOldAudioSystem oldAudioSystem;
public AudioSystemAdapter(IOldAudioSystem oldSystem)
{
oldAudioSystem = oldSystem;
}
// 새로운 오디오 시스템의 PlayAudioFile
public void PlayAudioFile(string path)
{
// 오래된 시스템의 메소드를 호출
oldAudioSystem.PlaySound(path);
}
}
C#
복사
4. 어댑티(Adaptee) - OldAudioSystem
•
역할 : 어댑티는 기존에 존재하는, 타겟 인터페이스와는 다른 인터페이스를 가진 클래스입니다. 이 예시에서는 OldAudioSystem이 어댑티의 역할을 합니다.
public class OldAudioSystem : IOldAudioSystem
{
public void PlaySound(string file)
{
// 오래된 오디오 재생 로직
}
}
C#
복사
어댑터 패턴 UML
아래는 어댑터 패턴의 UML 입니다.