Anlamaya biraz zaman aldı bu cevabı ve gerçekten ne o anlamına gelir. Birkaç örnek bunu daha açık hale getirmelidir.
Proxy
ilk:
public interface Authorization {
String getToken();
}
Ve :
// goes to the DB and gets a token for example
public class DBAuthorization implements Authorization {
@Override
public String getToken() {
return "DB-Token";
}
}
Ve bunu arayan biri var, Authorization
oldukça aptal biri:
class Caller {
void authenticatedUserAction(Authorization authorization) {
System.out.println("doing some action with : " + authorization.getToken());
}
}
Şimdiye kadar alışılmadık bir şey yok, değil mi? Belirli bir hizmetten jeton alın, bu jetonu kullanın. Şimdi resme bir gereksinim daha geliyor, günlük kaydı ekleyin: yani her seferinde jetonu günlüğe kaydedin. Bu durum için çok basit, sadece bir tane oluşturun 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;
}
}
Bunu nasıl kullanacağız?
public static void main(String[] args) {
LoggingDBAuthorization loggingDBAuthorization = new LoggingDBAuthorization();
Caller caller = new Caller();
caller.authenticatedUserAction(loggingDBAuthorization);
}
Bir örneğini LoggingDBAuthorization
tutan dikkat edin DBAuthorization
. Hem LoggingDBAuthorization
ve DBAuthorization
uygulayın Authorization
.
- Bir proxy
DBAuthorization
, temel arayüzün ( Authorization
) somut bir uygulamasını ( ) tutacaktır . Diğer bir deyişle, bir Vekil tam olarak neye vekalet edildiğini bilir .
Decorator
:
Hemen hemen aynı Proxy
arayüzle başlar:
public interface JobSeeker {
int interviewScore();
}
ve bunun bir uygulaması:
class Newbie implements JobSeeker {
@Override
public int interviewScore() {
return 10;
}
}
Ve şimdi daha tecrübeli bir aday eklemek istiyoruz, bu da mülakat puanının yanı sıra diğerinden birini ekliyor JobSeeker
:
@RequiredArgsConstructor
public class TwoYearsInTheIndustry implements JobSeeker {
private final JobSeeker jobSeeker;
@Override
public int interviewScore() {
return jobSeeker.interviewScore() + 20;
}
}
Buna ek olarak başka bir JobSeeker'dan gelen söylediğime dikkat edin , değil Newbie
. Bir Decorator
bilmiyor tam olarak (bu bilmektedir o süslü örneğinin sadece sözleşme bilir, dekorasyon ne JobSeeker
). Burada bunun a'dan farklı olduğuna dikkat edin Proxy
; bunun aksine, tam olarak neyi süslediğini biliyor.
Bu durumda iki tasarım modeli arasında gerçekten bir fark olup olmadığını sorgulayabilirsiniz. Decorator
Bir olarak yazmaya çalışırsak ne olur Proxy
?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
Bu kesinlikle bir seçenektir ve bu modellerin ne kadar yakın olduğunu vurgular; diğer cevaplarda açıklandığı gibi hala farklı senaryolar için tasarlanmıştır.