この答えとそれが実際に何を意味するのかを理解するのにしばらく時間がかかりました. いくつかの例がそれをより明確にするはずです。
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そして、かなりばかげたthis の呼び出し元があります:
class Caller {
void authenticatedUserAction(Authorization authorization) {
System.out.println("doing some action with : " + authorization.getToken());
}
}
これまでのところ異常はありませんよね?特定のサービスからトークンを取得し、そのトークンを使用します。ここで、もう 1 つの要件があります。ログを追加します。つまり、毎回トークンをログに記録します。この場合は簡単です。次を作成するだけ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;
}
}
ではなく、別の JobSeeker からのものに加えて言ったことに注目してください。Aは何を装飾しているのか正確にはわかりません。その装飾されたインスタンスのコントラクトだけを知っています (それは について知っています)。これは;とは異なることに注意してください。対照的に、それが何を飾っているのかを正確に知っています。 NewbieDecoratorJobSeekerProxy
この場合、実際に 2 つの設計パターンに違いがあるかどうか疑問に思われるかもしれません。Decoratorをとして書き込もうとした場合はどうなるでしょうProxyか。
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
これは間違いなくオプションであり、これらのパターンがどれほど近いかを強調しています。他の回答で説明されているように、それらは依然としてさまざまなシナリオを対象としています。