Proxy Pattern একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন, যা একটি অবজেক্টের রিপ্রেজেন্টেশন প্রদান করে, অর্থাৎ একটি অবজেক্টের প্রক্সি (প্রতিনিধি) তৈরি করে। এটি আসল অবজেক্টের সাথে সংযোগ স্থাপন করার আগে কিছু অতিরিক্ত কাজ (যেমন, নিরাপত্তা যাচাইকরণ, লেজি লোডিং, লগিং, বা এক্সেস কন্ট্রোল) সম্পাদন করার জন্য ব্যবহৃত হয়। সহজ ভাষায়, Proxy Pattern আসল অবজেক্টের মাধ্যমে এক্সেস নিয়ন্ত্রণের একটি মেকানিজম প্রদান করে।
1. Proxy Pattern কী?
Proxy Pattern একটি অবজেক্টের জন্য অন্য একটি অবজেক্ট তৈরি করে যা আসল অবজেক্টের সঙ্গে ইন্টারঅ্যাক্ট করে। এটি ক্লায়েন্টকে আসল অবজেক্টের উপর সরাসরি অ্যাক্সেস প্রদান না করে, তার পরিবর্তে এক বা একাধিক প্রকারের কার্যকারিতা সম্পাদন করে।
Proxy Pattern সাধারণত ব্যবহার করা হয়:
- Lazy Initialization: অবজেক্ট তৈরির কাজটি বিলম্বিত করতে, যাতে শুধুমাত্র যখন প্রয়োজন হয় তখনই অবজেক্টটি তৈরি করা হয়।
- Access Control: যখন কিছু নিরাপত্তা বা এক্সেস কন্ট্রোল প্রক্রিয়া দরকার থাকে।
- Remote Proxy: একটি অবজেক্ট ক্লায়েন্ট এবং সেবার মধ্যে দূরবর্তী ইন্টারঅ্যাকশন পরিচালনা করতে সাহায্য করে।
- Virtual Proxy: অবজেক্টের ভারী রিসোর্স লোডিং বিলম্বিত করতে ব্যবহৃত হয়।
2. Proxy Pattern এর উপাদানসমূহ
- Subject: একটি সাধারণ ইন্টারফেস যা আসল এবং প্রক্সি ক্লাস দ্বারা বাস্তবায়িত হয়। এটি আসল অবজেক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয়।
- RealSubject: আসল অবজেক্ট যা প্রক্সি দ্বারা প্রতিনিধিত্ব করা হয়।
- Proxy: এটি Subject ইন্টারফেসের বাস্তবায়ন প্রদান করে এবং আসল অবজেক্টের উপর কিছু অতিরিক্ত কার্যকারিতা যোগ করে।
3. Proxy Pattern এর উদাহরণ
ধরা যাক আমাদের একটি Image অবজেক্ট রয়েছে, যেখানে Image একটি ভারী অবজেক্ট এবং শুধুমাত্র যখন প্রয়োজন হয় তখনই এটি লোড করা উচিত। এখানে, আমরা Proxy ব্যবহার করব যাতে Lazy Initialization করতে পারি এবং শুধুমাত্র যখন সেই ইমেজটি প্রদর্শন করার প্রয়োজন হবে তখন সেটি লোড করা হবে।
3.1. Proxy Pattern Implementation Example in Java
// Subject Interface
interface Image {
void display();
}
// RealSubject: Actual Image class
class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadImageFromDisk();
}
private void loadImageFromDisk() {
System.out.println("Loading image: " + fileName);
}
@Override
public void display() {
System.out.println("Displaying image: " + fileName);
}
}
// Proxy class: Controls access to RealImage
class ProxyImage implements Image {
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(fileName); // Lazy initialization
}
realImage.display();
}
}
// Client Code
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image1 = new ProxyImage("image1.jpg");
Image image2 = new ProxyImage("image2.jpg");
// Image will be loaded only when needed
image1.display(); // First time loading image
image1.display(); // Image already loaded, no need to load again
image2.display(); // First time loading image
}
}
ব্যাখ্যা:
- Image ইন্টারফেসটি হল Subject, যা display() মেথড ঘোষণা করে।
- RealImage হল আসল অবজেক্ট, যা আসল ইমেজ লোড এবং প্রদর্শন করে।
- ProxyImage হল প্রক্সি ক্লাস, যা RealImage এর উপর Lazy Initialization এবং অন্যান্য কার্যকারিতা (যেমন, এক্সেস কন্ট্রোল) প্রদান করে।
- Lazy Initialization: প্রথমবারের জন্য ইমেজটি Proxy ক্লাসে লোড হবে, এবং পরবর্তী সময়ে ইমেজটি পুনরায় লোড করা হবে না।
আউটপুট:
Loading image: image1.jpg
Displaying image: image1.jpg
Displaying image: image1.jpg
Loading image: image2.jpg
Displaying image: image2.jpg
4. Proxy Pattern এর ব্যবহার
Proxy Pattern বিভিন্ন ক্ষেত্রে ব্যবহার করা যায়, যেমন:
- Lazy Initialization: ভারী অবজেক্ট বা রিসোর্স লোডিং বিলম্বিত করতে।
- Access Control: ব্যবহারকারীর অধিকার বা অনুমতি যাচাই করতে।
- Remote Proxy: একটি অবজেক্টের দূরবর্তী অ্যাক্সেস পরিচালনা করতে।
- Virtual Proxy: একটি ভারী রিসোর্স লোডিংয়ের ক্ষেত্রে ব্যবহৃত হয়, যেমন ডেটাবেস কুয়েরি বা গ্রাফিক্স।
5. Proxy Pattern এর সুবিধা
- Performance Optimization: ভারী রিসোর্সগুলি কেবল তখনই লোড করা হয় যখন সেগুলি প্রয়োজন হয়, যা স্মৃতি এবং প্রসেসিং ক্ষমতা সংরক্ষণ করতে সাহায্য করে।
- Access Control: নিরাপত্তা এবং অনুমতি যাচাইয়ের জন্য ব্যবহার করা যেতে পারে।
- Separation of Concerns: প্রক্সি ক্লাসটি মূল অবজেক্টের বাস্তবায়ন থেকে আলাদা থাকে, যা separation of concerns নিশ্চিত করে এবং কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়।
- Encapsulation: আসল অবজেক্টের কার্যকারিতা ক্লায়েন্ট থেকে লুকিয়ে রাখা যায়।
6. Proxy Pattern এর অসুবিধা
- Overhead: প্রক্সি ব্যবহারের জন্য অতিরিক্ত লেয়ারের কারণে কিছু পারফরম্যান্স ওভারহেড হতে পারে।
- Complexity: প্রক্সি প্যাটার্নের প্রয়োগ কিছু ক্ষেত্রে কোডের জটিলতা বাড়াতে পারে, বিশেষত যখন বিভিন্ন ধরনের প্রক্সি ব্যবহৃত হয়।
সারাংশ
Proxy Pattern হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা আসল অবজেক্টের মাধ্যমে এক্সেস নিয়ন্ত্রণের জন্য একটি প্রতিনিধির (proxy) ব্যবহার করে। এটি মূলত Lazy Initialization, Access Control, Remote Proxy, এবং Virtual Proxy এর মতো সমস্যা সমাধান করতে ব্যবহৃত হয়। Java তে Proxy Pattern ব্যবহার করা হয় যখন আমাদের আসল অবজেক্টের সঙ্গে সরাসরি ইন্টারঅ্যাক্ট না করে কিছু অতিরিক্ত কার্যকারিতা প্রয়োগ করতে হয়, যেমন সুরক্ষা যাচাই বা দেরিতে রিসোর্স লোডিং।