이 답변과 그 의미 를 파악하는 데 시간 이 걸렸습니다 . 몇 가지 예가 더 명확해야합니다.
Proxy
먼저:
public interface Authorization {
String getToken();
}
그리고 :
// goes to the DB and gets a token for example
public class DBAuthorization implements Authorization {
@Override
public String getToken() {
return "DB-Token";
}
}
그리고 이것의 호출자 Authorization
, 꽤 바보 같은 사람이 있습니다 :
class Caller {
void authenticatedUserAction(Authorization authorization) {
System.out.println("doing some action with : " + authorization.getToken());
}
}
지금까지 특이한 것은 없습니까? 특정 서비스에서 토큰을 얻으려면 해당 토큰을 사용하십시오. 이제 그림에 요구 사항이 하나 더 있습니다. 로깅을 추가하십시오. 매번 토큰을 기록한다는 의미입니다. 이 경우 간단합니다 Proxy
.
public class LoggingDBAuthorization implements Authorization {
private final DBAuthorization dbAuthorization = new DBAuthorization();
@Override
public String getToken() {
String token = dbAuthorization.getToken();
System.out.println("Got token : " + token);
return token;
}
}
우리는 그것을 어떻게 사용할 것입니까?
public static void main(String[] args) {
LoggingDBAuthorization loggingDBAuthorization = new LoggingDBAuthorization();
Caller caller = new Caller();
caller.authenticatedUserAction(loggingDBAuthorization);
}
공지 사항 LoggingDBAuthorization
보유 의 인스턴스를 DBAuthorization
. 두 LoggingDBAuthorization
및 DBAuthorization
구현 Authorization
.
- 프록시는
DBAuthorization
기본 인터페이스 ( Authorization
)를 구체적으로 구현합니다 ( ). 다시 말해 프록시는 프록시가 무엇 인지 정확히 알고 있습니다.
Decorator
:
Proxy
인터페이스와 거의 동일하게 시작됩니다 .
public interface JobSeeker {
int interviewScore();
}
그리고 그 구현 :
class Newbie implements JobSeeker {
@Override
public int interviewScore() {
return 10;
}
}
이제 우리는 더 경험이 많은 후보자를 추가하고 싶습니다. 인터뷰 점수에 다른 점수를 더한 것입니다 JobSeeker
.
@RequiredArgsConstructor
public class TwoYearsInTheIndustry implements JobSeeker {
private final JobSeeker jobSeeker;
@Override
public int interviewScore() {
return jobSeeker.interviewScore() + 20;
}
}
공지 사항 내가 말한 어떻게 플러스 다른 구직자의 하나 , 하지 Newbie
. A Decorator
는 그것이 무엇을 꾸미고 있는지 정확히 알지 못하고 , 장식 된 인스턴스의 계약 만 알고 있습니다 (에 대해 아는 것 JobSeeker
). 여기서는 이와 다릅니다 Proxy
. 대조적으로, 그것이 무엇을 장식하는지 정확히 알고 있습니다.
이 경우 두 디자인 패턴간에 실제로 차이가 있는지 의문을 가질 수 있습니까? 어떻게 우리가 작성하려고하면 Decorator
A와를 Proxy
?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
이것은 확실히 옵션이며 이러한 패턴이 얼마나 가까운 지 강조합니다. 그들은 여전히 다른 답변에서 설명 된 것처럼 다른 시나리오를위한 것입니다.