프록시 패턴은 객체에 대한 접근을 제어하는 대리자 객체를 제공하는 구조적 디자인 패턴이다. 이 패턴은 원본 객체에 대한 간접적인 접근을 가능하게 하여 추가적인 기능을 제공하거나 객체 생성의 비용을 절감할 수 있다.
from abc import ABC, abstractmethod
class Subject(ABC):
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
def request(self):
print("RealSubject: Handling request.")
class Proxy(Subject):
def __init__(self, real_subject: RealSubject):
self._real_subject = real_subject
def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()
def check_access(self):
print("Proxy: Checking access prior to firing a real request.")
return True
def log_access(self):
print("Proxy: Logging the time of request.")
# 클라이언트 코드
def client_code(subject: Subject):
subject.request()
if __name__ == "__main__":
print("Client: Executing the client code with a real subject:")
real_subject = RealSubject()
client_code(real_subject)
print("\nClient: Executing the same client code with a proxy:")
proxy = Proxy(real_subject)
client_code(proxy)
프록시 패턴은 객체 지향 프로그래밍에서 유용하게 사용되는 패턴으로, 특히 객체의 생성 비용이 높거나 보안이 중요한 상황에서 효과적으로 활용될 수 있다.
두 패턴은 각각 다른 문제를 해결하지만, 때로는 함께 사용될 수 있다. 예를 들어, Factory 패턴으로 생성된 객체에 대한 접근을 Proxy 패턴으로 제어할 수 있다.