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

[C#] Proxy 패턴

agingcurve 2024. 4. 15. 14:54
반응형

카테고리 : 구조패턴

개요 : Proxy 패턴은 클라이언트가 실제 사용을 원하는 객체를 직접 사용하는 것이 아니라 그 객체에 대한 대리자(Proxy) 역할을 하는 객체를 두고, 클라이언트가 대리자(Proxy( 객체를 통해서 실제 객체를 사용하도록 하는 방식이다.

 

Proxy 패턴은 클라이언트와 실제 사용하고자 하는 객체(RealSubject) 사이에 대리자(Proxy)를 두고, 실제 객체(RealSubject) 대신 대리자를 호출하는 방식이다. 대리자(Proxy) 객체는 실제 객체와 동일한 인터페이스를 가지며, 클라이언트와 실제 객체 사이에는 하나 이상의 복수 Proxy 객체가 있을 수 있다.

 

Proxy 패턴에서 대리자(Proxy)는 단순하게는 클아이언트 요청을 그대로 실제 객체에 전달 가능하며, 대리자(Proxy)객체에 추가적인 기능 삽입이 가능하다. 

 

 

기본적인 Proxy패턴은 아래와 같다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }

    public interface Subject
    {
        void Operation();
    }
    public class RealSubject : Subject
    {
        public void Operation() { }
    }

    public class Proxy : Subject
    {
        private RealSubject realSubject;

        public Proxy()
        {
            realSubject = new RealSubject();
        }

        public void Operation()
        {
            //forward
            realSubject.Operation();
        }
    }

    class Client
    {
        void HowToUse()
        {
            Subject s = new Proxy();
            s.Operation();
        }
    }

}

 

 

프록시 패턴은 기본적으로 실제 객체와 대리자가 공통으로 사용하는 인터페이스를 정의하고, 이 공통 인터페이스를 Proxy 클래스와 RealSubject클래스에서 구현하면 된다.

프록시 클래스는 일반적으로 캐싱, 리모팅, 필터링 등과 같은 추가적인 기능을 작는 경우가 많다.

 

아래는 웹사이트 접속을 제한하는 기능을 가진 Proxy 클래스를 예시한 것이다. 클라이언트는 Proxy를 통해 웹사이트에 접속하는데 해킹이나 사기 사이트를 필터링 해주는 역할을 한다.

 

using System;
using System.Collections.Generic;
using System.Net;


namespace WebProxy
{
    public interface IWeb
    {
        string Visit(string url);
    }

    // Proxy 클래스
    public class ProxyWeb : IWeb
    {
        private IWeb realWeb = new RealWeb();

        List<string> BAD_SITES = new List<string>
        {
            "hackersite.com",
            "frausite.com",
            "phishingsite.com"
        };

        public string Visit(string url)
        {
            //나쁜 사이트 필터링
            if (BAD_SITES.Contains(url))
            {
                return null; //or throw
            }

            // 아니면 ReadWeb 호출
            return realWeb.Visit(url);
      
        }
    }

    public class RealWeb : IWeb
    {
        public string Visit(string url)
        {
            var wc = new WebClient();
            return wc.DownloadString(url);
        }
    }

    class Client
    {
        public static void HowToTest()
        {
            // Proxy를 통해 호출
            IWeb web = new ProxyWeb();
            string result = web.Visit("http://frausite.com");
            Console.WriteLine(result);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Client.HowToTest();
        }
    }
}

'C# 이것저것 > C# 디자인패턴' 카테고리의 다른 글

[C#] Decorator 패턴  (0) 2024.04.15
[C#] Bridge 패턴  (0) 2024.04.06
[C#] Adapter 패턴  (0) 2024.03.31
[C#] Object Pool 패턴  (0) 2024.03.31