Java 8 Functional Interface
Functional Interface একটি ইন্টারফেস যা শুধুমাত্র একটি abstract method ধারণ করে। জাভা ৮ থেকে lambda expressions এবং method references এর মাধ্যমে functional programming সমর্থিত হয়, যার ফলে ফাংশনাল ইন্টারফেস ব্যবহার করা সহজ এবং শক্তিশালী হয়। এই ইন্টারফেসগুলো একাধিক কার্যক্রম বা আচরণকে অভ্যন্তরীণভাবে ইনক্যাপসুলেট (encapsulate) করার জন্য ব্যবহার করা হয়, যা সাধারণত Strategy Pattern এর সাথে মিলে যায়।
Functional Interface এর বৈশিষ্ট্য:
- এটি এমন একটি ইন্টারফেস যা একটি মাত্র abstract method রাখে।
- এটি default methods বা static methods ধারণ করতে পারে, তবে এর একটি abstract method থাকতে হবে।
- সাধারণভাবে lambda expressions বা method references এর সাথে ব্যবহৃত হয়।
Functional Interface উদাহরণ:
@FunctionalInterface
interface Strategy {
void executeStrategy(int num1, int num2); // Abstract method
// Default method
default void logStrategy() {
System.out.println("Executing Strategy");
}
}
এখানে, Strategy ইন্টারফেস একটি functional interface যা একটি মাত্র abstract method (executeStrategy) ধারণ করে, এবং একটি default method (logStrategy) রয়েছে।
Strategy Pattern
Strategy Pattern হল একটি Behavioral Design Pattern, যা একটি ইন্টারফেস এবং তার একাধিক বাস্তবায়ন দিয়ে বিভিন্ন আচরণকে সংজ্ঞায়িত করে। এই প্যাটার্নটি ব্যবহারকারীকে আচরণের পরিবর্তনযোগ্যতা প্রদান করে, যাতে তারা runtime এর মধ্যে সহজেই আচরণ বা স্ট্রাটেজি নির্বাচন করতে পারে।
Strategy Pattern মূলত তখন ব্যবহৃত হয় যখন আমাদের একাধিক উপায় বা কৌশল থাকে একটি সমস্যা সমাধান করার জন্য, এবং আমরা runtime এর মধ্যে এগুলির মধ্যে যে কোন একটি স্ট্রাটেজি নির্বাচন করতে চাই।
Strategy Pattern এর গঠন:
- Strategy Interface: এটি একটি সাধারণ ইন্টারফেস যা বিভিন্ন স্ট্রাটেজি বা কৌশলের জন্য একক মেথড নির্ধারণ করে।
- Concrete Strategy: এই ক্লাসগুলো Strategy Interface ইমপ্লিমেন্ট করে এবং বাস্তবায়ন করে বিভিন্ন কৌশল।
- Context: এই ক্লাসটি Strategy Interface গ্রহণ করে এবং নির্দিষ্ট কৌশলকে কার্যকর করে।
Strategy Pattern উদাহরণ:
ধরা যাক, আমাদের একটি Sorting Strategy সিস্টেম তৈরি করতে হবে, যেখানে বিভিন্ন সোর্টিং কৌশল (যেমন Bubble Sort, Quick Sort, Merge Sort) ব্যবহার করা যাবে। Java 8 Functional Interface এবং Lambda Expressions ব্যবহার করে আমরা সহজেই Strategy Pattern বাস্তবায়ন করতে পারি।
1. Strategy Interface:
@FunctionalInterface
interface SortStrategy {
void sort(int[] array);
}
এখানে, SortStrategy একটি Functional Interface যা একটি sort() মেথড ধারণ করে।
2. Concrete Strategies (Sorting algorithms):
class BubbleSort implements SortStrategy {
@Override
public void sort(int[] array) {
System.out.println("Sorting using BubbleSort");
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
}
class QuickSort implements SortStrategy {
@Override
public void sort(int[] array) {
System.out.println("Sorting using QuickSort");
quickSort(array, 0, array.length - 1);
}
private void quickSort(int[] array, int low, int high) {
if (low < high) {
int pi = partition(array, low, high);
quickSort(array, low, pi - 1);
quickSort(array, pi + 1, high);
}
}
private int partition(int[] array, int low, int high) {
int pivot = array[high];
int i = (low - 1);
for (int j = low; j < high; j++) {
if (array[j] < pivot) {
i++;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
int temp = array[i + 1];
array[i + 1] = array[high];
array[high] = temp;
return i + 1;
}
}
3. Context:
class SortContext {
private SortStrategy strategy;
// Set strategy dynamically
public void setStrategy(SortStrategy strategy) {
this.strategy = strategy;
}
// Delegate sorting task to the strategy
public void executeStrategy(int[] array) {
strategy.sort(array);
}
}
4. Client Code (Testing the Strategy Pattern):
public class StrategyPatternDemo {
public static void main(String[] args) {
int[] array = {5, 3, 8, 4, 2};
// Creating context
SortContext context = new SortContext();
// Sorting with BubbleSort
context.setStrategy(new BubbleSort());
context.executeStrategy(array);
// Sorting with QuickSort
context.setStrategy(new QuickSort());
context.executeStrategy(array);
}
}
Output:
Sorting using BubbleSort
Sorting using QuickSort
এখানে, SortContext ক্লাসটি SortStrategy ইন্টারফেসের মাধ্যমে বিভিন্ন সোর্টিং স্ট্রাটেজি নির্বাচন এবং প্রয়োগ করতে সক্ষম হয়। BubbleSort এবং QuickSort দুইটি স্ট্রাটেজি হিসেবে ব্যবহার করা হয়েছে।
Java 8 Functional Interface এবং Strategy Pattern এর মধ্যে সম্পর্ক
Java 8 থেকে Functional Interface এবং Lambda Expressions এর সাহায্যে আমরা Strategy Pattern অনেক সহজ এবং সংক্ষিপ্তভাবে বাস্তবায়ন করতে পারি। Functional Interface ব্যবহার করলে কোড আরও পরিষ্কার, compact এবং কার্যকরী হয়। আপনি সহজেই Lambda Expressions ব্যবহার করে স্ট্রাটেজি পরিবর্তন করতে পারেন, যা কোডের নমনীয়তা বৃদ্ধি করে।
উদাহরণ:
public class StrategyPatternWithLambda {
public static void main(String[] args) {
// Using lambda expressions for strategies
SortStrategy bubbleSort = (array) -> {
System.out.println("Sorting using BubbleSort");
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
};
int[] array = {5, 3, 8, 4, 2};
SortContext context = new SortContext();
// Set strategy to BubbleSort
context.setStrategy(bubbleSort);
context.executeStrategy(array);
}
}
এখানে, Lambda Expression ব্যবহার করে আমরা BubbleSort স্ট্রাটেজি খুব সহজে একত্রিত করেছি।
সারাংশ
Strategy Pattern একটি শক্তিশালী ডিজাইন প্যাটার্ন যা সফটওয়্যার সিস্টেমে আচরণের পরিবর্তনযোগ্যতা এনে দেয়, যেখানে ব্যবহারকারী runtime এ আলাদা আলাদা কৌশল (strategy) নির্বাচন করতে পারে। Java 8 Functional Interface এর মাধ্যমে আমরা Strategy Pattern অনেক সহজভাবে বাস্তবায়ন করতে পারি, যেখানে lambda expressions কৌশলের পরিবর্তন করতে সহায়তা করে এবং কোডকে আরও পরিষ্কার এবং নমনীয় করে তোলে।
এই প্যাটার্নের মাধ্যমে সিস্টেমের কোড পরিবর্তন না করে নতুন স্ট্রাটেজি প্রয়োগ করা সহজ হয় এবং এটি সফটওয়্যার রক্ষণাবেক্ষণ এবং এক্সটেনশনকে সহজ করে তোলে।