[디자인 패턴] 어댑터 패턴 (Adapter Pattern)

⭐ 어댑터 패턴이란?

서로 호환되지 않는 클래스나 시스템을 연결할 때, 중간에 "변환기(어댑터)"를 두어 기존 코드를 바꾸지 않고도 호환되게 만드는 패턴입니다. 서로 다른 인터페이스를 가진 클래스들을 함께 작동하게 하고 싶을 때 사용합니다.

 

 

 

⭐ 어댑터 패턴의 구성 요소

● Target (목표 인터페이스): 클라이언트가 기대하는 인터페이스

● Adaptee (적응될 클래스): 기존에 존재하는 클래스, 인터페이스가 달라서 바로 사용할 수 없음

● Adapter (어댑터): Target 인터페이스를 구현하고, 내부적으로 Adaptee를 호출하여 변환

 

 

 

⭐ 어댑터 패턴의 장단점

● 장점

    ○ 기존 코드를 수정하지 않고 새로운 클래스 추가 가능

    ○ 서로 호환되지 않는 인터페이스를 연결 가능

    ○ OCP(Open-Closed Principle, 개방-폐쇄 원칙) 준수

 

● 단점

    ○ 어댑터 클래스가 많아지면 오히려 코드가 복잡해짐

    ○ 단순히 호환성만 제공, 근본적인 설계 문제는 해결되지 않음

 

 

 

⭐ 어댑터 패턴 예시

● Zombie.cs

public class Zombie : MonoBehaviour
{
   public void Bite()
   {
       Debug.Log("Zombie bite!");
   }
}

 

● Alien.cs

public class Alien : MonoBehaviour
{
   public void Shoot()
   {
       Debug.Log("Alien shoot!");
   }
}

 

● Alien을 Zombie로 바꾸는 어댑터

public class AlienAdapter : Alien
{
    private Alien alien;

    public AlienAdapter(Alien alien)
    {
        this.alien = alien;
    }

    public void Bite()
    {
        alien.Shoot();
    }
}

 

● MonsterManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterManager : MonoBehaviour
{
    private Zombie _zombie;
    private Alien _alien;
    private AlienAdapter _alienAdapter;

    public void Start()
    {
        _zombie = new Zombie();
        _alien = new Alien();
        _alienAdapter = new AlienAdapter(_alien);

        _zombie.Bite();
        _alienAdapter.Bite();

    }
}

 

● MonsterManager 클래스를 통해 다양한 종류의 몬스터 공격을 Attack으로 실행하고 싶음

    ○ Zombie와 Alien 클래스를 보면 공격 메서드가 다름 → AlienAdapter를 이용해 Alien도 Bite로 공격 가능