Visitor Pattern একটি Behavioral Design Pattern যা অবজেক্টের স্ট্রাকচারের বাইরে থাকা কিছু নতুন কার্যকলাপ সংজ্ঞায়িত করতে ব্যবহৃত হয়। এই প্যাটার্নটি বিশেষভাবে উপকারী যখন আপনি একটি অবজেক্ট গঠন বা স্ট্রাকচার পরিবর্তন না করে, সেই স্ট্রাকচারের উপর বিভিন্ন অপারেশন প্রয়োগ করতে চান।
Visitor Pattern এ, আপনি একটি Visitor ক্লাস তৈরি করেন যা কিছু অবজেক্টের উপর অপারেশন বা কর্ম চালায়। এর মাধ্যমে আপনি বিভিন্ন ধরনের অপারেশন (যেমন গণনা, বৈধতা পরীক্ষা, প্রিন্ট) করতে পারেন, যেখানে অবজেক্টের ক্লাস কনক্রিট থাকলেও স্ট্রাকচারের পরিবর্তন ছাড়াই নতুন নতুন ফাংশনালিটি যোগ করা যায়।
Visitor Pattern এর উপকারিতা:
- নতুন অপারেশন যোগ করা সহজ: আপনি যখনই নতুন কোনও অপারেশন করতে চান, তখন আপনি কেবল একটি নতুন ভিজিটার ক্লাস তৈরি করতে পারেন, পুরনো কোডে কোন পরিবর্তন না এনে।
- স্ট্রাকচারে পরিবর্তন না করা: Visitor প্যাটার্ন আপনাকে অবজেক্টের স্ট্রাকচার পরিবর্তন না করেই নতুন ফাংশনালিটি বা অপারেশন প্রদান করতে দেয়।
- একটি কেন্দ্রীয় স্থান থেকে একাধিক অপারেশন চালানো: এই প্যাটার্নটি আপনাকে সমস্ত অবজেক্টের উপর একযোগে অপারেশন চালানোর সুবিধা দেয়।
Visitor Pattern এর কাঠামো
Visitor Pattern এর মধ্যে সাধারণত ৩টি গুরুত্বপূর্ণ উপাদান থাকে:
- Visitor Interface: এটি একটি ইন্টারফেস যা একটি visit মেথড নিয়ে থাকে এবং বিভিন্ন Element অবজেক্টে প্রয়োগ করার জন্য ডিজাইন করা হয়।
- Concrete Visitor: এটি
Visitorইন্টারফেসের কনক্রিট ইমপ্লিমেন্টেশন যেখানে কার্যকরী লজিক থাকে। - Element Interface: এটি একটি ইন্টারফেস যা
accept()মেথড ঘোষণা করে। Element অবজেক্টে ভিজিটরের visit মেথড কল করা হয়। - Concrete Element: এটি Element ইন্টারফেসের কনক্রিট ক্লাস, যা accept() মেথডের মাধ্যমে ভিজিটরকে অনুমতি দেয়।
Visitor Pattern এর উদাহরণ (Java)
ধরা যাক, আমাদের একটি কোর্স সিস্টেম রয়েছে যেখানে বিভিন্ন ধরনের কোর্স আছে (যেমন, MathematicsCourse, ScienceCourse), এবং আমাদের প্রত্যেকটি কোর্সের জন্য Discount এবং Certificate তৈরি করতে হবে। আমরা Visitor Pattern ব্যবহার করে এই সমস্যা সমাধান করব।
Step 1: Visitor Interface
interface CourseVisitor {
void visit(MathematicsCourse mathCourse);
void visit(ScienceCourse scienceCourse);
}
Step 2: Concrete Visitor Classes
class DiscountVisitor implements CourseVisitor {
@Override
public void visit(MathematicsCourse mathCourse) {
System.out.println("Applying discount on Mathematics course");
// Implement discount logic for Mathematics course
}
@Override
public void visit(ScienceCourse scienceCourse) {
System.out.println("Applying discount on Science course");
// Implement discount logic for Science course
}
}
class CertificateVisitor implements CourseVisitor {
@Override
public void visit(MathematicsCourse mathCourse) {
System.out.println("Issuing certificate for Mathematics course");
// Implement certificate issuing logic for Mathematics course
}
@Override
public void visit(ScienceCourse scienceCourse) {
System.out.println("Issuing certificate for Science course");
// Implement certificate issuing logic for Science course
}
}
Step 3: Element Interface
interface Course {
void accept(CourseVisitor visitor);
}
Step 4: Concrete Element Classes
class MathematicsCourse implements Course {
@Override
public void accept(CourseVisitor visitor) {
visitor.visit(this);
}
}
class ScienceCourse implements Course {
@Override
public void accept(CourseVisitor visitor) {
visitor.visit(this);
}
}
Step 5: Client Code
public class VisitorPatternExample {
public static void main(String[] args) {
// Create concrete courses
Course mathCourse = new MathematicsCourse();
Course scienceCourse = new ScienceCourse();
// Create visitors
CourseVisitor discountVisitor = new DiscountVisitor();
CourseVisitor certificateVisitor = new CertificateVisitor();
// Applying visitors to courses
mathCourse.accept(discountVisitor); // Discount on Mathematics
scienceCourse.accept(discountVisitor); // Discount on Science
mathCourse.accept(certificateVisitor); // Certificate for Mathematics
scienceCourse.accept(certificateVisitor); // Certificate for Science
}
}
ব্যাখ্যা:
- CourseVisitor: এটি একটি ইন্টারফেস যা
visit()মেথড ধারণ করে। এই মেথডগুলি বিভিন্ন কোর্স (যেমন MathematicsCourse, ScienceCourse) এর জন্য কার্যকরী হবে। - ConcreteVisitor: এখানে দুটি কনক্রিট ভিজিটর রয়েছে, একটি DiscountVisitor এবং একটি CertificateVisitor, যা কোর্সের উপর Discount এবং Certificate প্রয়োগ করে।
- Course: এটি একটি ইন্টারফেস যা
accept()মেথড ধারণ করে, যাতে প্রতিটি কোর্স ক্লাস (যেমন MathematicsCourse, ScienceCourse) ভিজিটরেরvisit()মেথডকে কল করে। - ConcreteElement: MathematicsCourse এবং ScienceCourse ক্লাস দুটি accept() মেথড ইমপ্লিমেন্ট করে, যেখানে তারা ভিজিটরের
visit()মেথডে নিজেকে পাঠায়।
আউটপুট:
Applying discount on Mathematics course
Applying discount on Science course
Issuing certificate for Mathematics course
Issuing certificate for Science course
Visitor Pattern এর সুবিধা এবং ব্যবহার
সুবিধা:
- নতুন অপারেশন যোগ করা সহজ: নতুন নতুন কার্যকলাপ (operation) যুক্ত করা খুব সহজ, আপনি কেবল নতুন ভিজিটর ক্লাস তৈরি করে তা প্রয়োগ করতে পারেন, কোর্সের ক্লাসে কোন পরিবর্তন না করেই।
- স্ট্রাকচারে পরিবর্তন ছাড়া ফাংশনালিটি যোগ: আপনি অবজেক্টের স্ট্রাকচারে কোনও পরিবর্তন না করেও নতুন নতুন ফাংশনালিটি বা অপারেশন যোগ করতে পারেন।
- কোড বিচ্ছিন্নতা: একাধিক ভিজিটর এবং অবজেক্টের মধ্যে কার্যকলাপের পৃথকীকরণ আপনার কোডের রক্ষণাবেক্ষণ এবং পরিবর্তন সহজ করে।
ব্যবহার:
- কমপ্লেক্স অবজেক্ট স্ট্রাকচার: যেখানে একাধিক অপারেশন অবজেক্টে প্রয়োগ করা হয়, কিন্তু অবজেক্টের স্ট্রাকচারে পরিবর্তন না করা হয়।
- কমপ্লেক্স রিপোর্টিং সিস্টেম: যেখানে আপনি বিভিন্ন ধরনের রিপোর্ট বা স্ট্যাটিস্টিকস তৈরি করতে চান, তবে রিপোর্টিং লজিক অবজেক্টের মধ্যে প্রতিস্থাপন না করেই প্রয়োগ করা সম্ভব।
- প্রসেসিং ডেটা: যেখানে বিভিন্ন ডেটার উপর বিভিন্ন ধরনের প্রসেসিং করা হয় (যেমন, discount, billing, validation)।
সারাংশ
Visitor Pattern একটি Behavioral Design Pattern যা অবজেক্টের উপর বিভিন্ন অপারেশন (যেমন, Discount, Certificate) প্রয়োগ করতে সাহায্য করে, অবজেক্ট স্ট্রাকচারের পরিবর্তন না করে। এটি একটি open/close principle অনুসরণ করে, যেখানে নতুন অপারেশন বা কার্যকলাপ সংযোজন করা যায় কিন্তু বিদ্যমান কোডে কোনও পরিবর্তন করতে হয় না। Java তে Visitor Pattern বাস্তবায়ন করে একাধিক অপারেশন খুবই কার্যকরভাবে প্রয়োগ করা যায়, বিশেষ করে যদি সেই অপারেশন গুলি অনেক অবজেক্টে প্রয়োগ করতে হয়।
Read more