Template Method Pattern একটি Behavioral Design Pattern যা একটি অ্যালগরিদমের মৌলিক কাঠামো নির্ধারণ করে এবং কিছু স্টেপের জন্য সাবক্লাসে কাস্টম লজিক (যথা: hook methods) বাস্তবায়ন করতে দেয়। এটি সাধারনত abstract class বা interface এর মাধ্যমে ডিজাইন করা হয় যেখানে মূল অ্যালগরিদমের স্টেপগুলির ভিত্তি নির্ধারিত থাকে, এবং সাবক্লাসে কাস্টম লজিক প্রয়োগ করা হয়।
ফাংশনাল প্রোগ্রামিং প্যারাডাইমে Template Method Pattern এর বাস্তবায়ন কিছুটা ভিন্ন হয়। এখানে Lambda Expressions এবং Higher-order functions ব্যবহার করে আপনি Template Method Pattern বাস্তবায়ন করতে পারেন, যা কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।
এখানে Template Method Pattern এর functional approach ব্যবহার করে উদাহরণ দেখানো হলো।
Template Method Pattern (Traditional Approach)
প্রথাগতভাবে, Template Method Pattern একটি abstract class ব্যবহার করে বাস্তবায়িত হয়, যেখানে আপনি মূল অ্যালগরিদমের কাঠামো নির্ধারণ করেন এবং কিছু স্টেপ সাবক্লাসে কাস্টমাইজ করতে দেন।
Traditional Template Method Pattern Example:
abstract class Game {
// Template method
public void play() {
initializeGame();
startPlay();
endPlay();
}
// Abstract methods to be implemented by subclasses
abstract void initializeGame();
abstract void startPlay();
abstract void endPlay();
}
class Football extends Game {
@Override
void initializeGame() {
System.out.println("Football game initialized.");
}
@Override
void startPlay() {
System.out.println("Football game started.");
}
@Override
void endPlay() {
System.out.println("Football game ended.");
}
}
class Basketball extends Game {
@Override
void initializeGame() {
System.out.println("Basketball game initialized.");
}
@Override
void startPlay() {
System.out.println("Basketball game started.");
}
@Override
void endPlay() {
System.out.println("Basketball game ended.");
}
}
public class TemplateMethodPatternExample {
public static void main(String[] args) {
Game football = new Football();
football.play();
System.out.println("\n");
Game basketball = new Basketball();
basketball.play();
}
}
Explanation:
- এখানে, Game একটি abstract class যা play() নামক একটি টেমপ্লেট মেথড সরবরাহ করে। এটি তিনটি স্টেপে বিভক্ত: initializeGame(), startPlay(), এবং endPlay()।
- Football এবং Basketball ক্লাসগুলি এই স্টেপগুলির জন্য কাস্টম ইমপ্লিমেন্টেশন সরবরাহ করে।
Functional Approach to Template Method Pattern
Java 8 এবং তার পরবর্তী সংস্করণে Functional Programming ধারণা অন্তর্ভুক্ত হওয়ায়, আপনি Template Method Pattern ফাংশনাল স্টাইলেও প্রয়োগ করতে পারেন। এর জন্য higher-order functions, lambda expressions, এবং functional interfaces ব্যবহার করা হয়।
Functional Template Method Pattern Example:
import java.util.function.Consumer;
public class FunctionalTemplateMethodPattern {
// Template method using lambda expressions and higher-order functions
public static void playGame(Consumer<Void> initialize, Consumer<Void> start, Consumer<Void> end) {
initialize.accept(null);
start.accept(null);
end.accept(null);
}
public static void main(String[] args) {
// For Football Game
Consumer<Void> footballInitialize = v -> System.out.println("Football game initialized.");
Consumer<Void> footballStart = v -> System.out.println("Football game started.");
Consumer<Void> footballEnd = v -> System.out.println("Football game ended.");
playGame(footballInitialize, footballStart, footballEnd);
System.out.println("\n");
// For Basketball Game
Consumer<Void> basketballInitialize = v -> System.out.println("Basketball game initialized.");
Consumer<Void> basketballStart = v -> System.out.println("Basketball game started.");
Consumer<Void> basketballEnd = v -> System.out.println("Basketball game ended.");
playGame(basketballInitialize, basketballStart, basketballEnd);
}
}
Explanation:
- এখানে,
playGameমেথডটি একটি template method যা তিনটি স্টেপ গ্রহণ করে:initialize,start, এবংend। এই তিনটি স্টেপ একটিConsumer<Void>ফাংশনাল ইন্টারফেস হিসেবে পাস করা হয়েছে, যা lambda expressions ব্যবহার করে কাস্টম লজিক কার্যকরী করছে। - Functional Approach এ, আমরা কেবল Consumer ফাংশনগুলির মাধ্যমে স্টেপগুলির কার্যকারিতা নির্ধারণ করেছি, যা ফাংশনাল স্টাইলে কোড লেখার একটি চমৎকার উদাহরণ।
Advantages of Using Functional Approach for Template Method Pattern
- Flexibility:
- Functional style আপনাকে আরও নমনীয়তা প্রদান করে, যেখানে আপনি অ্যালগরিদমের বিভিন্ন স্টেপের জন্য lambda expressions পাস করতে পারেন, যা কোডকে আরও সংক্ষিপ্ত এবং পরিষ্কার করে।
- Separation of Concerns:
- কাস্টম লজিকগুলি সহজেই আলাদা করা যায়, কারণ স্টেপগুলি ইন্টারফেসের মাধ্যমে পাস করা হচ্ছে, যা কোডকে আরও পরিষ্কার এবং রিডেবল করে তোলে।
- Reuse of Logic:
- Functional interfaces এবং higher-order functions এর মাধ্যমে, আপনি একই লজিক অনেক জায়গায় পুনঃব্যবহার করতে পারেন, যেমন বিভিন্ন গেমের জন্য।
- Increased Readability and Maintainability:
- কোডের গঠন সহজ এবং পরিষ্কার হয়, কারণ আপনি প্রতিটি স্টেপের জন্য কাস্টম লজিক lambda expression বা function এর মাধ্যমে আলাদাভাবে প্রদান করেছেন।
Java তে Template Method Pattern এর functional programming পদ্ধতিতে বাস্তবায়ন করা অনেক বেশি নমনীয় এবং পরিষ্কার হয়। Higher-order functions এবং lambda expressions ব্যবহার করে আমরা এই প্যাটার্নের বিভিন্ন স্টেপ কাস্টমাইজ করতে পারি, যা কোডের পুনঃব্যবহারযোগ্যতা এবং মেইনটেনেবিলিটি বাড়ায়। এই পদ্ধতি আপনাকে object-oriented design এর পাশাপাশি functional programming এর সুবিধা দেয়, যা কোডের কার্যকারিতা এবং পরিষ্কারতা উন্নত করে।
Read more