Design Pattern/Structural
[Python] Proxy Pattern (프록시 패턴)
by_Exist
2020. 10. 9. 18:25
Proxy Pattern이란?
- 특정 타 객체로 접근하는 것을 통제하기 위해 해당 객체의 대리자 또는 자리채움자를 제공하는 패턴.
- 인터페이스를 변경하지 않으면서 기능을 추가하기 위해 사용되는 패턴.
예제
# RealSubject의 do_the_job의 기능으로 불만족스럽다.
# RealSubject를 수정하지 않으면서 기능을 추가하고 싶다.
class RealSubject:
def do_the_job(self, user: str) -> None:
print(f"{user}(이)가 작업을 수행합니다.")
# 동일한 인터페이스를 지닌 클래스를 선언하여 (ABC를 선언하여 상속해도 되겠다.)
class Proxy:
def __init__(self) -> None:
# has 관계로 소유하여
self._real_subject = RealSubject()
# 기능을 확장한다. (로깅, 캐싱, 권한 핸들링...)
def do_the_job(self, user: str) -> None:
print(f"[log] {user}의 작업 수행을 감지했습니다.")
if user == "admin":
self._real_subject.do_the_job(user)
else:
print("[log] `admins`이 아닌 유저는 작업을 수행할 수 없습니다.")
def main():
real_subject = RealSubject()
real_subject.do_the_job('admin')
real_subject.do_the_job('anonymous')
# admin(이)가 작업을 수행합니다.
# anonymous(이)가 작업을 수행합니다.
proxy = Proxy()
proxy.do_the_job('admin')
proxy.do_the_job('anonymous')
# [log] admin의 작업 수행을 감지했습니다.
# admin(이)가 작업을 수행합니다.
# [log] anonymous의 작업 수행을 감지했습니다.
# [log] `admins`이 아닌 유저는 작업을 수행할 수 없습니다.
if __name__ == "__main__":
main()
여담
- Proxy 패턴과 Decorator 패턴의 차이점
- Proxy는 인터페이스를 고정하며, Decorator는 인터페이스를 변경할 수 있다.
- 정적 언어에서는 해당 패턴이 정의되는 시점이 다르다고 한다. 컴파일(Proxy), 런타임(Decorator).
- Proxy 패턴은 객체 접근의 제어를 목적으로 하며, Decorator는 기능의 추가를 목적으로 한다.
- 클라이언트 코드 수정 없이 기존 객체에 추가 동작을 구현할 경우에 사용될 수 있겠다.