Proxy
2022. 3. 11. 00:00ㆍCSharp/Design Pattern
반응형
어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조 하는것이 아니라, 해당 객체를 대행(대리, proxy)하는 객체를 통해 대상객체에 접근 하는 패턴
아래와 같은 경우에 사용된다.
- 지연 초기화
- 액세스 제어
- 원격 서비스의 로컬 실행
- 로깅 요청
- 캐싱
- 스마트 참조
class diagram
어떤 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
Рос?я - це втрата!!
관련영상
반응형
'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 |