proxy 패턴 예제

프록시 디자인 패턴의 GoF 정의에 따라 프록시 개체는 다른 개체에 대한 액세스를 제어하는 서로게이트 또는 자리 표시자를 제공합니다. 프록시는 기본적으로 보안상의 이유 나 완전히 초기화 된 원본 개체를 만드는 데 드는 비용과 같은 여러 가지 이유로 인해 만드는 의도 된 개체를 대신합니다. 위의 UML 클래스 다이어그램에서 프록시 클래스는 Subject 개체를 대신할 수 있도록 Subject 인터페이스를 구현합니다. 대체 된 개체 (RealSubject)에 대 한 참조 (realSubject)를 유지 하 고 요청을 전달할 수 있도록 (realSubject.operation()) 주어진 예제에서, 우리는 클라이언트가 뭔가를 할 액세스 해야 하는 RealObject. 프레임워크에 RealObject 의 인스턴스를 제공하도록 요청합니다. 그러나 이 개체에 대한 액세스를 보호해야 하므로 프레임워크는 RealObjectProxy에 대한 참조를 반환합니다. 프록시 패턴은 원래 서비스 개체와 동일한 인터페이스를 가진 새 프록시 클래스를 만들 것을 제안합니다. 그런 다음 프록시 개체를 원래 개체의 모든 클라이언트에 전달하도록 앱을 업데이트합니다. 클라이언트로부터 요청을 받으면 프록시는 실제 서비스 개체를 만들고 모든 작업을 위임합니다. 실제 예는 수표 또는 신용 카드가 우리 은행 계좌에 있는 것에 대한 프록시일 수 있습니다. 그것은 현금 대신 사용할 수 있으며, 필요한 경우 그 현금에 액세스 하는 수단을 제공 합니다.

그리고 프록시 패턴이 하는 바로 그 것입니다 – “보호하고 있는 객체에 대한 액세스를 제어하고 관리합니다.” 프록시는 클라이언트와 실제 구현 사이에 장벽을 제공합니다. 이것은 패턴과 매우 유사하다는 것을 알게 될 것입니다. 그러나 봇간의 주요 차이점은 어댑터가 상호 운용성을 허용하기 위해 다른 인터페이스를 노출한다는 것입니다. 프록시는 동일한 인터페이스를 노출하지만 처리 시간이나 메모리를 절약하는 데 방해가 됩니다. 이 예제에서는 프록시 패턴을 사용하여 비효율적인 제3자 YouTube 통합 라이브러리에 지연 초기화 및 캐싱을 구현하는 데 도움이 됩니다. 평소와 같이 디자인 패턴을 다룰 때 인터페이스에 코드를 지정합니다. 이 경우 클라이언트가 알고 있는 인터페이스는 제목입니다. 프록시 및 RealSubject 개체 모두 주체 인터페이스를 구현하지만 클라이언트는 프록시를 거치지 않고 RealSubject에 액세스하지 못할 수 있습니다. 프록시가 RealSubject 개체의 생성을 처리하는 것은 매우 일반적이지만 적어도 메시지를 전달할 수 있도록 참조가 있습니다.

개체에 대한 액세스를 제어하는 기능이 필요한 경우도 있습니다. 예를 들어 비용이 많이 드는 일부 개체의 몇 가지 메서드만 사용해야 하는 경우 완전히 필요할 때 해당 개체를 초기화합니다. 그 시점까지 우리는 무거운 물체와 동일한 인터페이스를 노출 하는 일부 라이트 개체를 사용할 수 있습니다. 이러한 라이트 오브젝트를 프록시라고 하며, 필요한 경우 무거운 오브젝트를 인스턴스화하고 그 다음에는 일부 라이트 오브젝트를 대신 사용합니다. 프록시 이미지를 사용하여 필요한 경우 RealImage 클래스의 개체를 가져옵니다. 이 패턴은 일부 클라이언트에서 RealSubject 코드에 직접 액세스하고 일부 클라이언트가 프록시 클래스에 액세스할 수 있는 경우 문제가 될 수 있는 또 다른 추상화 계층을 도입합니다. 이로 인해 서로 다른 동작이 발생할 수 있습니다. 프록시 [1] 디자인 패턴은 유연하고 재사용 가능한 객체 지향 소프트웨어, 즉 구현, 변경, 테스트 및 구현하기 쉬운 객체를 설계하기 위해 반복되는 설계 문제를 해결하는 방법을 설명하는 23개의 잘 알려진 GoF 디자인 패턴 중 하나입니다. 재사용.

클래스 CommandExecutorProxy에서는 “개인 CommandExecutor 실행기;” “개인 CommandExecutorImpl 실행기;”를 변경하는 것이 더 효율적입니다. 구현을 직접 사용하지 않습니까? 개체에 대한 액세스를 제어하려는 이유는 무엇입니까? 다음은 방대한 양의 시스템 리소스를 소비하는 대규모 개체가 있다는 예입니다.

Comments

Comments are closed.