C# 이것저것/C# 디자인패턴

[C#] Adapter 패턴

agingcurve 2024. 3. 31. 17:21
반응형

카테고리 : 구조 패턴(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