Chain of Responsibility Pattern একটি Behavioral Design Pattern যা একটি প্রক্রিয়া বা কনসেপ্টের মাধ্যমে অনুরোধ গুলির পরিচালনা করতে ব্যবহৃত হয়। এই প্যাটার্নে, একটি চেইন (দ্বারা একাধিক অবজেক্টের মাধ্যমে) বার্তা বা অনুরোধের প্রক্রিয়া স্থানান্তরিত করা হয়, যাতে একাধিক অবজেক্ট এটি প্রক্রিয়া করতে পারে।
এই প্যাটার্নের মূল লক্ষ্য হলো, অনুরোধটি কোন অবজেক্টের মাধ্যমে প্রক্রিয়া হবে তা আগে থেকেই নির্ধারণ না করে, একটি চেইন তৈরি করা, যেখানে প্রতিটি অবজেক্ট নিজের দায়িত্ব অনুযায়ী অনুরোধটি প্রক্রিয়া করতে সক্ষম। যদি একটি অবজেক্ট অনুরোধটি প্রক্রিয়া না করতে পারে, তবে এটি পরবর্তী অবজেক্টে পাঠানো হয় এবং এই প্রক্রিয়া চেইন আকারে চলতে থাকে।
Chain of Responsibility Pattern এর বৈশিষ্ট্যসমূহ:
- Responsibility Distribution: একাধিক অবজেক্টের মধ্যে একটি কাজের দায়বদ্ধতা ভাগ করা হয়।
- Loosely Coupled: এটি অবজেক্টগুলির মধ্যে জোরালো সম্পর্ক সৃষ্টি না করে, তাদের মধ্যে আলাদা আলাদা দায়িত্ব ভাগ করে দেয়।
- Flexible: নতুন অবজেক্ট বা হ্যান্ডলার অ্যাড করার জন্য সহজ।
Chain of Responsibility Pattern এর কাঠামো:
- Handler: এটি একটি ইন্টারফেস বা অ্যাবস্ট্রাক্ট ক্লাস হতে পারে, যার মধ্যে একটি request handling করার জন্য একটি
handleRequest()মেথড থাকে। - ConcreteHandler: এটি
Handlerক্লাস বা ইন্টারফেসের একটি কনক্রিট ইমপ্লিমেন্টেশন। এই ক্লাসে অনুরোধ প্রক্রিয়া করার লজিক থাকে এবং পরবর্তী অবজেক্টে (হ্যান্ডলার) অনুরোধটি পাঠানোর জন্য একটি রেফারেন্স থাকে। - Client: ক্লায়েন্ট অনুরোধ পাঠায় এবং চেইন অফ হ্যান্ডলার গুলি সেগুলি প্রক্রিয়া করে।
Chain of Responsibility Pattern উদাহরণ (Java)
ধরা যাক, আমাদের একটি সিস্টেম তৈরি করতে হবে যেখানে এজেন্ট এবং ম্যানেজার একটি কমপ্লেন-এ কাজ করবে, কিন্তু তাদের মধ্যে দায়িত্ব ভাগ করা থাকবে। ক্লায়েন্ট যদি প্রথমে এজেন্টকে কমপ্লেনটি দেন, তবে এজেন্ট যদি কমপ্লেনটি সমাধান করতে না পারে, তবে সেটি ম্যানেজার এর কাছে চলে যাবে।
Step 1: Handler Interface
interface ComplaintHandler {
void handleComplaint(String complaint);
}
Step 2: ConcreteHandler Classes
class Agent implements ComplaintHandler {
private ComplaintHandler nextHandler;
@Override
public void handleComplaint(String complaint) {
if (complaint.equalsIgnoreCase("Minor issue")) {
System.out.println("Agent is handling the complaint: " + complaint);
} else {
if (nextHandler != null) {
nextHandler.handleComplaint(complaint);
}
}
}
public void setNextHandler(ComplaintHandler nextHandler) {
this.nextHandler = nextHandler;
}
}
class Manager implements ComplaintHandler {
@Override
public void handleComplaint(String complaint) {
System.out.println("Manager is handling the complaint: " + complaint);
}
}
Step 3: Client Code
public class ChainOfResponsibilityExample {
public static void main(String[] args) {
// Create handlers
ComplaintHandler agent = new Agent();
ComplaintHandler manager = new Manager();
// Set next handler for agent
((Agent) agent).setNextHandler(manager);
// Client submitting complaints
agent.handleComplaint("Minor issue"); // Handled by agent
agent.handleComplaint("Major issue"); // Handled by manager
}
}
ব্যাখ্যা:
- ComplaintHandler: এটি একটি ইন্টারফেস যা
handleComplaint()মেথড নির্ধারণ করে। - Agent: এটি একটি কনক্রিট হ্যান্ডলার যা প্রথমে অভিযোগ দেখে যদি সেটা তার সীমানার মধ্যে থাকে তবে সেটি সমাধান করে। যদি না পারে, তবে
nextHandlerএর কাছে পাঠানো হয়। - Manager: এটি একটি দ্বিতীয় কনক্রিট হ্যান্ডলার যা পরে চলতে থাকে, যদি প্রথম হ্যান্ডলার (এজেন্ট) সমাধান না করে।
- Client Code: ক্লায়েন্ট প্রথমে এজেন্ট এর কাছে অভিযোগ পাঠায় এবং যদি সেটি সমাধান না হয়, তবে তা ম্যানেজার এর কাছে চলে যায়।
আউটপুট:
Agent is handling the complaint: Minor issue
Manager is handling the complaint: Major issue
Chain of Responsibility Pattern এর সুবিধা এবং ব্যবহার
সুবিধা:
- লোস লিংকড: এটি অবজেক্টগুলির মধ্যে খুব কম সম্পর্ক তৈরি করে, যার ফলে নতুন হ্যান্ডলার যোগ করা সহজ হয়ে যায়।
- ডায়নামিক নিয়ন্ত্রণ: এটি বিভিন্ন ধরণের সমস্যার জন্য একাধিক হ্যান্ডলার ব্যবহার করতে দেয়।
- কোডে স্পষ্টতা বৃদ্ধি: প্রতিটি হ্যান্ডলার এককভাবে কাজ করার কারণে কোডের অর্গানাইজেশন পরিষ্কার হয়।
ব্যবহার:
- ইভেন্ট হ্যান্ডলিং: ইভেন্ট বা ইনপুট প্রক্রিয়াতে যেখানে একাধিক সাব-প্রসেস তাদের নিজ নিজ দায়িত্বে কাজ করে।
- লগিং ফ্রেমওয়ার্ক: একটি লগিং সিস্টেম যেখানে একাধিক লগ হ্যান্ডলার থাকে (যেমন, FileHandler, ConsoleHandler, DatabaseHandler)।
- এজেন্ট-ম্যানেজার সিস্টেম: যেখানে কমপ্লেনের বা সমস্যার জন্য একাধিক স্তর (Agent, Manager, Director) থাকে।
সারাংশ
Chain of Responsibility Pattern হল একটি বিহেভিয়ারাল ডিজাইন প্যাটার্ন যা একটি চেইন তৈরি করে যাতে একাধিক অবজেক্ট বা হ্যান্ডলার অনুসন্ধান বা প্রক্রিয়াজাতকরণের দায়িত্ব নেয়। এটি কোডের মধ্যকার জটিলতা কমায় এবং বিভিন্ন প্রক্রিয়া বা অনুসন্ধান অবজেক্টের মধ্যে দায়িত্ব ভাগ করে দেয়, যাতে প্রতিটি অবজেক্ট একে অপরের সাথে সম্পর্কিত না হয়ে কাজ করতে পারে। Java তে এই প্যাটার্নটি ব্যবহারে কোডের পুনঃব্যবহারযোগ্যতা, এবং রক্ষণাবেক্ষণযোগ্যতা বাড়ানো যায়, এবং সিস্টেমকে আরো ফ্লেক্সিবল ও এডজাস্টেবল করা যায়।