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, Authorizationoldukç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 LoggingDBAuthorizationve 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ı Proxyarayü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 Decoratorbilmiyor 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. DecoratorBir 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.