디자인 패턴을 이해하고 사용하면 좋은 객체 지향 프로그래밍 습관을 키울 수 있으며 실제 응용 분야에서는 편안한 즐거움을 누릴 수 있습니다.
프록시는 비교적 유용한 모델이며, 많은 변형 시나리오는 프록시의 개념을 가질 수 있습니다. 설명 : 출발점에서 목적지 사이의 중간 층이 있으며, 이는 에이전트를 의미합니다.
설계 패턴으로 정의 : 다른 개체 가이 객체에 대한 액세스를 제어 할 수있는 프록시를 제공합니다.
프록시 모드를 사용하는 이유
1. 승인 메커니즘 다른 수준의 승인을받는 사용자는 동일한 개체에 대한 접근 권한을 가지고 있습니다. (등록되지 않은 사용자) 및 Jive에서는 ForumProxy와 같은 대리를 통해이 두 사용자의 액세스 권한을 포럼에 제어 할 수 있습니다.
2. 클라이언트는 객체로 직접 작동 할 수는 없지만 해당 객체와 상호 작용해야합니다.
두 가지 구체적인 예를 제시하십시오.
1. 객체가 큰 이미지이고 표시하는 데 시간이 오래 걸리면 이미지가 문서에 포함되면 편집기 또는 브라우저를 사용하여 문서를 열면 문서를 매우 빨리 열어야하며 대기 할 수 없습니다. 큰 이미지 처리가 완료되며 현재 이미지 프록시를 사용해야합니다.
2. 해당 객체가 인터넷의 원격 서버에 있고 네트워크 속도로 인해이 객체가 느리게 작동하는 경우 프록시를 사용하여 해당 객체를 먼저 교체 할 수 있습니다.
요컨대, 오버 헤드가 높은 객체의 경우이 원칙을 사용할 때만 생성되면 많은 귀중한 자바 메모리를 절약 할 수 있습니다. 따라서 어떤 사람들은 Java가 자원 메모리를 소비한다고 생각하며, 이것이 프로그래밍 아이디어와 관련이 있다고 생각합니다.
프록시 모드를 사용하는 방법
Jive Forum 시스템을 예로 들어 포럼 시스템을 방문하는 많은 유형의 사용자가 등록 된 일반 사용자, 포럼 관리자, 시스템 관리자 및 관광객이 있습니다. 일반 사용자를 등록하면 포럼 관리자가 공인 포럼을 관리 할 수 있으며 시스템 관리자는 모든 거래 등을 관리 할 수 있습니다.
포럼은 Jive의 핵심 인터페이스입니다. 포럼 운영과 관련된 주요 동작은 포럼 이름, 포럼 설명, 사후 삭제 및 편집 등과 같은 포럼에 표시됩니다.
다양한 수준의 권한이있는 사용자는 포럼 관리에 정의됩니다.
코드 사본은 다음과 같습니다.
공개 클래스 포럼 관리는 캐시 가능한 {를 구현합니다.
/**
* 객체를 읽을 수있는 권한.
*/
공개 정적 최종 int read = 0;
/**
* 관리자에게 전체 시스템을 허가합니다.
*/
공개 정적 최종 int System_Admin = 1;
/**
* 관리자에게 특정 포럼을 허가합니다.
*/
공개 정적 최종 int forum_admin = 2;
/**
* 관리자에게 특정 사용자에게 권한.
*/
공개 정적 최종 int user_admin = 3;
/**
* 관리자에게 특정 그룹의 권한.
*/
공개 정적 최종 int group_admin = 4;
/**
* 지대형 스레드에 대한 권한.
*/
공개 정적 최종 int moderate_threads = 5;
/**
* 새 스레드 생성 권한.
*/
공개 정적 최종 int create_thread = 6;
/**
* 새 메시지를 만들 수있는 권한.
*/
공개 정적 최종 int create_message = 7;
/**
* 현대 메시지에 대한 허가.
*/
공개 정적 최종 int moderate_messages = 8;
..... .....
공개 부울 issystemorforumadmin () {
return (value [forum_admin] || value [system_admin]);
}
..... .....
}
따라서 포럼의 다양한 작업 권한은 Forum Porum의 구현으로 Forumproxy 가이 서신 관계를 연결하는 사용자 수준과 관련이 있습니다. 예를 들어, 포럼 이름을 수정할 때 포럼 관리자 또는 시스템 관리자 만 수정할 수 있으며 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
공개 수업 포럼 프록시는 포럼 {
개인 포럼 봉사 권한;
개인 포럼 포럼;
이. 인증 = 승인;
공개 포럼 프록시 (포럼 포럼, 승인 승인,
Forumpermissions 권한) {
this.forum = 포럼;
이. 인증 = 승인;
this.permissions = 권한;
}
..... .....
public void setName (문자열 이름)은 무단 exception을 던지고,
ForumAlreadyExistSexception {
// 시스템 또는 포럼 관리자만이 이름을 if (permissions.issystemorforumadmin ())을 수정할 수 있습니다.
Forum.setName (이름);
}
또 다른 {
새로운 무단 exception ()을 던지십시오.
}
}
...
}
DBFORUM은 인터페이스 포럼의 실제 구현입니다.
코드 사본은 다음과 같습니다.
공개 클래스 dbforum은 포럼, 캐시 가능한 {
...
public void setName (String Name)은 포럼 알레드 existsexception을 던졌습니다.
.... ....
this.name = 이름;
// 여기에서 새 이름을 데이터베이스에 SavetOdb ()에 저장합니다.
.... ....
}
...
}
포럼 이름을 수정할 때마다 다른 프로그램은 포럼 프록시를 처리해야합니다.
매일 응용 프로그램에서는 프록시 사용 여부에 관계없이 시스템 권한 부여 또는 보안 시스템이 항상 관여하는 것이 불가피합니다.
Jive와 함께 더 깊이 이야기 해 봅시다. 공장 모델은 아래에 포함될 것입니다.
우리는 포럼을 사용하여 포럼 프록시를 사용해야한다는 것을 알고 있습니다. Jive는 공장 패턴을 사용하는 것이며,이 추상 클래스에는 GetInstance () 메소드를 통해 구현됩니다. 싱글 톤은 여기에서 (디자인 패턴 중 하나), getInstance ()는 ForumFactoryProxy를 반환합니다.
ForumFactory를 반환하지 않지만 ForumFactory 구현 ForumFactoryProxy를 반환하지 않겠습니까? 그 이유는 분명하며 포럼이 프록시를 통해이를 생성 할 권한이 있는지 여부를 결정해야합니다.
ForumFactoryProxy에서는 코드가 다음과 같이 보입니다.
코드 사본은 다음과 같습니다.
공개 클래스 포럼 FactoryProxy는 ForumFactory {
보호 된 Forum Factory Factory;
보호 된 승인 승인;
보호 된 포럼 운영 권한;
공개 ForumFactoryProxy (승인 승인, ForumFactory Factory, Forumpermissions 권한) {
this.factory = 공장;
이. 인증 = 승인;
this.permissions = 권한;
}
공개 포럼 CreateForum (문자열 이름, 문자열 설명)
무단 exception, ForumAlreadyExistSexception {
// 시스템 관리자 만 포럼을 만들 수 있습니다
if (permissions.get (forumpermissions.system_admin)) {
Forum NewForum = factory.createforum (이름, 설명);
새로운 ForumProxy를 반환합니다 (Newforum, 권한, 권한);
}
또 다른 {
새로운 무단 exception ()을 던지십시오.
}
}
}
이 방법은 포럼 프록시를 반환합니다. 다른 프로그램은 프록시와 만 상호 작용할 수 있습니다.
여기에는 두 가지 프록시가 있습니다 : ForumProxy 및 ForumFactoryProxy. 포럼 사용과 포럼 제작의 두 가지 책임을 나타냅니다. 객체를 사용하는 것이 객체 생성과 분리 된 이유에 관해서는 공장 패턴이 사용되는 이유입니다. "캡슐화"및 "디스패치"를위한 것입니다. 다시 말해, 기능은 유지 보수 및 수정을 용이하게하기 위해 가능한 한 단일입니다.
Jive 포럼 시스템의 다른 게시물 생성 및 사용은 포럼 아이디어를 기반으로합니다.
위에서 우리는 승인 메커니즘에 대한 액세스를 위해 프록시를 사용하는 방법에 대해 논의했습니다. 거대하고 복잡한 객체를 복사하는 것은 매우 비싼 작업입니다. 프록시를 사용 하여이 복사 프로세스를 지연시킵니다.
예를 들어 : Hashtable과 같은 대규모 컬렉션이 있으며 많은 고객이 동시에 동시에 액세스 할 것입니다. 특별 클라이언트 중 하나는 지속적인 데이터 수집을 수행해야하며 현재 다른 클라이언트는 더 이상 해시 가능에 물건을 추가하거나 삭제하지 않아도됩니다.
가장 직접적인 솔루션은 다음과 같습니다. 컬렉션 잠금을 사용 하고이 특수 클라이언트 가이 잠금을 얻고 연속 데이터 수집을 수행 한 다음 잠금을 해제하도록하십시오.
코드 사본은 다음과 같습니다.
공개 void fofetches (hashtable ht) {
동기화 (ht) {
// 특정 연속 데이터 수집 조치 ...
}
}
그러나이 방법은 컬렉션을 오랫동안 잠글 수 있으며이 기간 동안 다른 클라이언트가 컬렉션에 액세스 할 수 없습니다.
두 번째 솔루션은 컬렉션을 닫은 다음 연속 데이터가 클론에 대한 수집 작업을 얻도록하는 것입니다. 이 솔루션은 컬렉션이 클로닝 가능하며 깊은 클론을 제공하는 방법이 있어야한다는 사실을 전제로합니다. Hashtable은 자체 복제 방법을 제공하지만 키 및 가치 객체의 클론은 아닙니다.
코드 사본은 다음과 같습니다.
공개 void fofetches (hashtable ht) {
hashttable newht = (hashtable) ht.clone ();
}
문제는 다시 발생합니다. 클론을 기반으로 한 객체 작업이므로 원래 부모가 다른 클라이언트 작업에 의해 수정되면 클론 객체의 작동은 의미가 없습니다.
최종 해결책 : 복제하기 전에 다른 클라이언트가 수정을 완료 할 때까지 기다릴 수 있습니다. 즉,이 특별 클라이언트는 먼저 Clone이라는 메소드를 호출하여 일련의 데이터 수집 작업을 수행합니다. 그러나 실제로 다른 클라이언트가 객체 수집을 수정할 때까지 실제로 객체 복사가 수행되지 않았습니다.
복사본 작업 인 프록시를 사용 하여이 솔루션을 구현하십시오.
프록시에는 광범위한 응용 프로그램이 있습니다. RMI 및 CORBA와 같은 대중적인 분포 계산 방법은 모두 프록시 모드의 응용 프로그램입니다.