এই উত্তরটি এবং এর প্রকৃত অর্থটি খুঁজে বের করতে কিছুক্ষণ সময় নিল । কয়েকটি উদাহরণ এটি আরও স্পষ্ট করা উচিত।
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
। এ কী সজ্জিত করছে তা ঠিকDecorator
জানে না , এটি কেবল সজ্জিত উদাহরণের চুক্তিটি (এটি সম্পর্কে জানে ) জানে । এখানে দ্রষ্টব্য রাখুন যে এটি একটির মতো নয় ; বিপরীতে, এটি সজ্জিত কি ঠিক জানেন।JobSeeker
Proxy
আপনি প্রশ্ন করতে পারেন যদি এই ক্ষেত্রে দুটি ডিজাইনের ধরণের মধ্যে আসলেই কোনও পার্থক্য আছে? আমরা কি Decorator
হিসাবে লিখতে চেষ্টা করেছি Proxy
?
public class TwoYearsInTheIndustry implements JobSeeker {
private final Newbie newbie = new Newbie();
@Override
public int interviewScore() {
return newbie.interviewScore() + 20;
}
}
এটি অবশ্যই একটি বিকল্প এবং এই নিদর্শনগুলি কতটা নিকটবর্তী তা হাইলাইট করে; অন্যান্য উত্তরে বর্ণিত হিসাবে সেগুলি এখনও বিভিন্ন পরিস্থিতির জন্য তৈরি।