클라이언트는 서버에 필요한 것을 요청하고, 서버는 클라이언트의 요청을 처리한다.
이때 클라이언트가 서버를 호출하는 방식은 2가지가 있는데 클라이언트가 서버를 직접 호출하는 방식,
클라이언트가 프록시를 통해서 서버에 간접 호출하는 방식이다.
직접 호출 방식과는 다르게 간접 호출을 하면 프록시가 중간에서 여러가지 일을 할 수 있게 된다.
이런식으로 중간에서 대리자 역할을 하는 것을 프록시라고 한다.
객체에서 프록시는 아무 객체나 될 수 없다. 객체에서 프록시가 되려면 원본 객체와 동일한 인터페이스를 사용해야한다.
이는, 클라이언트가 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 모르게 하며 둘을 바꿔도 클라이언트 코드를 변경하지 않고 동작할 수 있게 한다.
위 설명과 그림을 보면 프록시 패턴과 데코레이터 패턴은 그 모양이나 기능이 거의 비슷하다.
Decorator
라는 추상 클래스는 없어도 무관하기 때문에 상황에 따라 똑같다고 볼 수도 있다.
그러면 둘은 어떻게 구분하는 것일까?
디자인 패턴에서 중요한 것은 패턴의 겉모양이 아니라 패턴을 만든 의도가 더 중요하다. 따라서 의도에 따라 패턴을 구분한다.
접근을 제어
하기 위해 프록시를 제공객체에 추가 기능을 동적으로 추가
하고, 기능 확장을 위한 유연한 대안 제공