Proxy

2022. 3. 11. 00:00CSharp/Design Pattern

반응형

어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조 하는것이 아니라, 해당 객체를 대행(대리, proxy)하는 객체를 통해 대상객체에 접근 하는 패턴

 

아래와 같은 경우에 사용된다.

 

  • 지연 초기화
  • 액세스 제어
  • 원격 서비스의 로컬 실행
  • 로깅 요청
  • 캐싱
  • 스마트 참조

https://refactoring.guru/design-patterns/proxy

 

class diagram

https://refactoring.guru/design-patterns/proxy

 

 

어떤 class 의 method 이전과 이후에 특정 작업(Logging) 을 하는 것을 proxy 로 처리해보자

이전에 사용한 flyweight 와 함께 사용해 보자

flyweight 관련 코드

public class HeavyObject
{
    private readonly string _name;
    private readonly int _age;

    public HeavyObject(string name, int age)
    {
        Thread.Sleep(TimeSpan.FromSeconds(1));
        _name = name;
        _age = age;
    }
    public void Execution()
    {
        Console.WriteLine($"Name : {_name} , Age : {_age}");
    }

}

public class HeavyObjectFactory
{
    private Dictionary<string, HeavyObject> _pool = new Dictionary<string, HeavyObject>();
    public HeavyObject Get(string name, int age)
    {
        string key = $"{name}{age}";
        if (!_pool.ContainsKey(key))
        {
            var obj = new HeavyObject(name,age);
            _pool.Add(key, obj);
            return obj;
        }
        return _pool[key];
    }
}

앞 뒤에 Log 를 추가한 Proxy 코드

public class HeavyObjectProxy
{
    private readonly HeavyObject _heavyObject;
    public HeavyObjectProxy(HeavyObject heavyObject)
    {
        _heavyObject = heavyObject;
    }

    public void Execution()
    {
        Console.WriteLine("Russia is a loss!!");
        _heavyObject.Execution();
        Console.WriteLine("Росія - це втрата!!");
    }
}

사용법

var factory = new HeavyObjectFactory();

var heavyObjectsProxy = new List<HeavyObjectProxy>();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
heavyObjectsProxy.Add(new HeavyObjectProxy(factory.Get("Putin", 69)));
heavyObjectsProxy.Add(new HeavyObjectProxy(factory.Get("Biden", 79)));
heavyObjectsProxy.Add(new HeavyObjectProxy(factory.Get("Zelensky", 44)));
stopwatch.Stop();
Console.WriteLine($"첫번째 초기화시 걸린 시간 {stopwatch.ElapsedMilliseconds}ms");

stopwatch.Restart();
heavyObjectsProxy.Add(new HeavyObjectProxy(factory.Get("Biden", 79)));
heavyObjectsProxy.Add(new HeavyObjectProxy(factory.Get("Putin", 69)));
heavyObjectsProxy.Add(new HeavyObjectProxy(factory.Get("Zelensky", 44)));
stopwatch.Stop();
Console.WriteLine($"두번째 초기화시 걸린 시간 {stopwatch.ElapsedMilliseconds}ms");

foreach (var heavyObject in heavyObjectsProxy)
    heavyObject.Execution();

// output
첫번째 초기화시 걸린 시간 3030ms
두번째 초기화시 걸린 시간 0ms
Russia is a loss!!
Name : Putin , Age : 69
Рос?я - це втрата!!
Russia is a loss!!
Name : Biden , Age : 79
Рос?я - це втрата!!
Russia is a loss!!
Name : Zelensky , Age : 44
Рос?я - це втрата!!
Russia is a loss!!
Name : Biden , Age : 79
Рос?я - це втрата!!
Russia is a loss!!
Name : Putin , Age : 69
Рос?я - це втрата!!
Russia is a loss!!
Name : Zelensky , Age : 44
Рос?я - це втрата!!

 

관련영상

https://youtu.be/P3bFuirBVwo

 

반응형

'CSharp > Design Pattern' 카테고리의 다른 글

Iterator  (0) 2022.03.15
Chain of Responsibility  (0) 2022.03.14
Flyweight  (0) 2022.03.11
Facade  (0) 2022.03.10
Decorator  (0) 2022.03.09