この答えとそれが実際に何を意味するのかを理解するのにしばらくかかりました。いくつかの例はそれをより明確にする必要があります。
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());
}
}
これまでに珍しいことはありませんよね?特定のサービスからトークンを取得し、そのトークンを使用します。画像にもう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;
}
}
私が言ったことをどのように注意してください、他の求職者からのプラスワン、ではありません Newbie
。A Decorator
はそれが何を修飾しているかを正確に知りません、それはその修飾されたインスタンスのコントラクトだけを知っています(それについて知っていますJobSeeker
)。これはとは異なることに注意してくださいProxy
。対照的に、それはそれが何を飾っているのかを正確に知っています。
この場合、2つのデザインパターンに実際に違いがあるかどうか疑問に思うかもしれません。をDecorator
として記述しようとするとどうなりProxy
ますか?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
これは間違いなくオプションであり、これらのパターンがどれほど近いかを強調しています。他の回答で説明されているように、それらは異なるシナリオを対象としています。