Strategy pattern က behavioral design pattern တစ်ခုပါ။ Strategy Pattern အကြောင်းပြောရရင် ပြဿနာ တစ်ခု ကို ဖြေရှင်းဖို့ အတွက် နည်းလမ်း မျိုးစုံ ရှိပါတယ်။ အဲဒီ နည်းလမ်းထဲက ဘယ် နည်းလမ်း နဲ့ ရှင်းမလဲ ဆိုတာကို ပြောပြပေးလိုက်တာပါပဲ။
ဥပမာ Google Map မှာ Point A ကနေ Point B ကို သွားမယ်။ အဲဒီ အခါမှာ သွားဖို့ Strategy တွေက
- ကား နဲ့ သွားမယ်
- လမ်းလျှောက် သွားမယ်
- bus နဲ့ သွားမယ်
ဆိုပြီး strategy ရှိလာပါတယ်။ Strategy ပေါ်မှာ မူတည်ပြီး Route ကို ဖန်တီး ပါတယ်။
Class Diagram ကို ကြည့်ရအောင်။
Java code ကို ကြည့်ရအောင်။
interface RouteStrategy {
void calculateRoute(String startPoint, String endPoint);
}
// Concrete Strategy: Car
class CarRouteStrategy implements RouteStrategy {
@Override
public void calculateRoute(String startPoint, String endPoint) {
System.out.println("Calculating car route from " + startPoint + " to " + endPoint);
// Put the actual car routing logic here
}
}
// Concrete Strategy: Bus
class BusRouteStrategy implements RouteStrategy {
@Override
public void calculateRoute(String startPoint, String endPoint) {
System.out.println("Calculating bus route from " + startPoint + " to " + endPoint);
// Put the actual bus routing logic here
}
}
// Concrete Strategy: Walk
class WalkRouteStrategy implements RouteStrategy {
@Override
public void calculateRoute(String startPoint, String endPoint) {
System.out.println("Calculating walking route from " + startPoint + " to " + endPoint);
// Put the actual walking routing logic here
}
}
// Context class
class NavigationContext {
private RouteStrategy routeStrategy;
public void setRouteStrategy(RouteStrategy routeStrategy) {
this.routeStrategy = routeStrategy;
}
public void calculateRoute(String startPoint, String endPoint) {
routeStrategy.calculateRoute(startPoint, endPoint);
}
}
public class Main {
public static void main(String[] args) {
NavigationContext navigation = new NavigationContext();
// Calculate the route by car
navigation.setRouteStrategy(new CarRouteStrategy());
navigation.calculateRoute("Home", "Office");
// Calculate the route by bus
navigation.setRouteStrategy(new BusRouteStrategy());
navigation.calculateRoute("Home", "School");
// Calculate the route by walking
navigation.setRouteStrategy(new WalkRouteStrategy());
navigation.calculateRoute("Park", "Market");
}
}
Navigation က calculateRoute ပဲ ခေါ်လိုက်တာပါပဲ။ ဒါပေမယ့် assign လုပ်ထားသည့် strategy ပေါ်မှာ မူတည်ပြီး routing result က ပြောင်းသွားမှာပါ။ CarRouteStrategy
သုံးမယ်ဆိုရင် CarRouteStrategy
ထဲက calculateRoute
နဲ့ အသုံးပြုသွားပါမယ်။
နောက်ထပ် ဥပမာ ပေးရရင် Product ကို sorting လုပ်မယ်ပေါ့။
Java code ကို ကြည့်ရအောင်။
// Strategy interface
interface SortStrategy {
void sort(int[] array);
}
// Concrete Strategy: BubbleSort
class BubbleSort implements SortStrategy {
@Override
public void sort(int[] array) {
// Put the actual BubbleSort logic here
// ...
System.out.println("BubbleSort applied.");
}
}
// Concrete Strategy: QuickSort
class QuickSort implements SortStrategy {
@Override
public void sort(int[] array) {
// Put the actual QuickSort logic here
// ...
System.out.println("QuickSort applied.");
}
}
// Concrete Strategy: MergeSort
class MergeSort implements SortStrategy {
@Override
public void sort(int[] array) {
// Put the actual MergeSort logic here
// ...
System.out.println("MergeSort applied.");
}
}
// Context class
class Products {
private int[] array;
private SortStrategy sortStrategy;
public Products(int[] array) {
this.array = array;
}
public void setSortStrategy(SortStrategy sortStrategy) {
this.sortStrategy = sortStrategy;
}
public void sort() {
sortStrategy.sort(array);
}
public void display() {
System.out.print("Sorted array: ");
for (int num : array) {
System.out.print(num + " ");
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
int[] array = { 64, 34, 25, 12, 22, 11, 90 };
Products products = new Products(array);
// Sort using BubbleSort
products.setSortStrategy(new BubbleSort());
products.sort();
products.display();
// Sort using QuickSort
products.setSortStrategy(new QuickSort());
products.sort();
products.display();
// Sort using MergeSort
products.setSortStrategy(new MergeSort());
products.sort();
products.display();
}
}
Pros and Cons
ကောင်းတာတွေကတော့
Runtime မှာ သက်ဆိုင်ရာ algorithms ကို ပြောင်းလဲ အသုံးပြုနိုင်ပါတယ်။ ဥပမာ Bus Route, Car Route လိုမျိုးပေါ့။
Open/Closed Principle ကိုလည်း follow လုပ်ထားပါတယ်။
မကောင်းတာကတော့
Algorithm တွေ ပြောင်းဖို့ မလိုသည့် project တွေမှာ ဆိုရင် သုံးဖို့ မလိုအပ်ပါဘူး။