Composite Pattern হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা অবজেক্টগুলোকে গঠনমূলকভাবে হায়ারার্কিক্যাল ট্রি আকারে সংগঠিত করে। এটি leaf এবং composite অবজেক্টগুলোকে একত্রে পরিচালনা করতে সাহায্য করে। এক কথায়, এটি tree structures বা hierarchical structures তৈরির জন্য ব্যবহৃত হয় যেখানে আপনি leaf এবং composite অবজেক্টগুলোকে একত্রে ব্যবহার করতে পারেন।
Composite Pattern এর মাধ্যমে single objects এবং groups of objects (কমপোজিট অবজেক্ট) একইভাবে ব্যবহার করা যায়। এর মাধ্যমে আপনি ক্লায়েন্ট কোডে একে অপরের মধ্যে পার্থক্য না রেখে একাধিক অবজেক্টকে একত্রে পরিচালনা করতে পারবেন।
উদাহরণ:
ধরা যাক একটি File System যেখানে ফাইল এবং ফোল্ডার উভয়ই FileSystemComponent হিসেবে ব্যবহার হতে পারে। ফাইলগুলো হল leaf অবজেক্ট এবং ফোল্ডারগুলো হল composite অবজেক্ট, যেগুলোর মধ্যে ফাইল এবং অন্য ফোল্ডার থাকতে পারে। আপনি একইভাবে ফাইল এবং ফোল্ডারকে প্রসেস করতে পারবেন।
1. Composite Pattern এর মৌলিক ধারণা
Composite Pattern তিনটি প্রধান উপাদান দিয়ে গঠিত:
- Component: এটি একটি সাধারণ ইন্টারফেস যা leaf এবং composite উভয়ের জন্য ব্যবহৃত হয়।
- Leaf: এটি এমন একটি অবজেক্ট যা কোনো উপাদান ধারণ করে না এবং একে সরাসরি প্রক্রিয়া করা হয়।
- Composite: এটি এমন একটি অবজেক্ট যা এক বা একাধিক leaf অথবা composite অবজেক্ট ধারণ করতে পারে এবং তাদের সাথে কার্যকরভাবে কাজ করে।
2. Composite Pattern এর বাস্তবায়ন
ধরা যাক আমরা একটি FileSystem ডিজাইন করতে চাই, যেখানে ফাইল এবং ফোল্ডার উভয়কেই একইভাবে পরিচালনা করা হবে। এর জন্য আমরা Composite Pattern ব্যবহার করতে পারি।
উদাহরণ: FileSystem Composite Pattern
import java.util.ArrayList;
import java.util.List;
// Component - FileSystemComponent Interface
interface FileSystemComponent {
void showDetails();
}
// Leaf - File class
class File implements FileSystemComponent {
private String name;
private int size;
public File(String name, int size) {
this.name = name;
this.size = size;
}
@Override
public void showDetails() {
System.out.println("File: " + name + ", Size: " + size + " KB");
}
}
// Composite - Folder class
class Folder implements FileSystemComponent {
private String name;
private List<FileSystemComponent> components = new ArrayList<>();
public Folder(String name) {
this.name = name;
}
// Add a component (either file or folder)
public void addComponent(FileSystemComponent component) {
components.add(component);
}
@Override
public void showDetails() {
System.out.println("Folder: " + name);
for (FileSystemComponent component : components) {
component.showDetails();
}
}
}
public class CompositePatternExample {
public static void main(String[] args) {
// Creating leaf components
File file1 = new File("file1.txt", 10);
File file2 = new File("file2.txt", 20);
File file3 = new File("file3.txt", 30);
// Creating composite components (folders)
Folder folder1 = new Folder("Folder1");
Folder folder2 = new Folder("Folder2");
// Adding files to folders
folder1.addComponent(file1);
folder1.addComponent(file2);
folder2.addComponent(file3);
folder2.addComponent(folder1); // Adding folder1 into folder2
// Displaying folder and file details
folder2.showDetails();
}
}
ব্যাখ্যা:
- FileSystemComponent ইন্টারফেসটি File এবং Folder উভয় ক্লাসের জন্য কমন ফাংশনালিটি সরবরাহ করে।
- File ক্লাসটি leaf অবজেক্ট, যেখানে শুধুমাত্র ফাইলের নাম এবং আকার সংরক্ষিত থাকে এবং এর
showDetails()ফাংশনটি ফাইলের তথ্য প্রদর্শন করে। - Folder ক্লাসটি composite অবজেক্ট, যা ফাইল এবং অন্যান্য ফোল্ডারকে ধারণ করে এবং তাদের
showDetails()ফাংশনটি কল করে।
আউটপুট:
Folder: Folder2
File: file3.txt, Size: 30 KB
Folder: Folder1
File: file1.txt, Size: 10 KB
File: file2.txt, Size: 20 KB
3. Composite Pattern এর সুবিধা
- Uniform Interface: Composite Pattern সব ধরনের অবজেক্ট (leaf এবং composite) এর জন্য একটি সাধারণ ইন্টারফেস প্রদান করে, যার ফলে ক্লায়েন্ট কোড সহজ হয় এবং একসাথে leaf এবং composite অবজেক্টগুলির সাথে কাজ করা যায়।
- Flexibility: এটি গঠনগতভাবে ফোল্ডার এবং ফাইলের মতো অবজেক্টগুলোকে একত্রে পরিচালনা করতে সহায়তা করে।
- Scalability: নতুন ধরনের অবজেক্ট (যেমন, নতুন ধরনের ফাইল বা ফোল্ডার) যোগ করা সহজ হয়।
- Reusability: এটি পুনঃব্যবহারযোগ্য, কারণ নতুন অবজেক্টগুলো পূর্ববর্তী ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ।
4. Composite Pattern এর বাস্তব প্রয়োগ
Composite Pattern অনেক ক্ষেত্রে ব্যবহৃত হয় যেখানে প্যারেন্ট এবং চিল্ড (leaf) অবজেক্টগুলো একত্রে পরিচালনা করতে হয়। কিছু সাধারণ বাস্তব প্রয়োগ হল:
- File Systems: ফাইল এবং ফোল্ডারগুলোকে একত্রে পরিচালনা করার জন্য ব্যবহৃত হয়।
- Graphics Systems: গ্রাফিক্যাল অবজেক্ট যেমন আয়তক্ষেত্র, বৃত্ত, লাইন ইত্যাদি, যেগুলি একটি গ্রাফিক্যাল কাঠামোতে একত্রে ব্যবহৃত হয়।
- UI Components: বিভিন্ন UI কম্পোনেন্ট যেমন প্যানেল, বোতাম, লেবেল, টেক্সট ফিল্ড, যা একত্রে কাজ করে এবং তাদের উপর একটি কমন ইন্টারফেস প্রয়োগ করা যায়।
Composite Pattern একটি শক্তিশালী ডিজাইন প্যাটার্ন যা কমপ্লেক্স এবং হায়ারার্কিক্যাল অবজেক্ট কাঠামো তৈরি করতে সাহায্য করে। এটি leaf এবং composite অবজেক্টগুলির মধ্যে এক ধরনের সম্পর্ক তৈরি করে এবং একটি সাধারণ ইন্টারফেসের মাধ্যমে তাদের পরিচালনা করতে সহায়তা করে। Java তে এই প্যাটার্ন ব্যবহার করে আপনি যেকোনো tree structure বা hierarchical structure কার্যকরীভাবে ম্যানেজ করতে পারবেন।