इस उत्तर का पता लगाने के लिए कुछ समय लिया और इसका वास्तव में क्या मतलब है। कुछ उदाहरणों से इसे और स्पष्ट होना चाहिए।
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
एक के रूप में लिखने की कोशिश की Proxy
?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
यह निश्चित रूप से एक विकल्प है और हाइलाइट करता है कि ये पैटर्न कितने करीब हैं; वे अभी भी अलग-अलग परिदृश्यों के लिए अभिप्रेत हैं जैसा कि अन्य उत्तरों में बताया गया है।