Strategy Pattern

Behavioral Design Patterns - জাভায় ডিজাইন প্যাটার্ন (Design Patterns in Java) - Java Technologies

294

Strategy Pattern হল একটি Behavioral Design Pattern, যা বিভিন্ন অ্যালগরিদম বা আচরণগুলিকে একে অপরের পরিবর্তে ব্যবহার করার সুযোগ প্রদান করে। এটি একটি ইন্টারফেস (Strategy) তৈরি করে যা বিভিন্ন Concrete Strategy ক্লাস দ্বারা বাস্তবায়িত হয়। Context ক্লাসটি Strategy ইন্টারফেসের একটি রেফারেন্স রাখে এবং প্রয়োজন অনুসারে বিভিন্ন Concrete Strategy ব্যবহার করে।

1. Strategy Pattern কী?

Strategy Pattern এর মূল উদ্দেশ্য হল একটি পরিবারের অ্যালগরিদমকে ইনকাপসুলেট করা এবং এগুলোকে একে অপরের পরিবর্তে ব্যবহার করার সুবিধা প্রদান করা। এটি ক্লায়েন্টকে নির্দিষ্ট অ্যালগরিদম বা আচরণ নির্বাচন করার ক্ষমতা দেয়, যা কোডের loose coupling নিশ্চিত করে এবং সহজে পরিবর্তনযোগ্য করে তোলে।

2. Strategy Pattern এর কাঠামো

Strategy Pattern তিনটি প্রধান উপাদান নিয়ে গঠিত:

  1. Strategy Interface: একটি সাধারণ ইন্টারফেস যা বিভিন্ন Concrete Strategy ক্লাসগুলি বাস্তবায়িত করে।
  2. Concrete Strategies: Strategy ইন্টারফেসের বিভিন্ন বাস্তবায়ন, যা বিভিন্ন অ্যালগরিদম বা আচরণ প্রতিনিধিত্ব করে।
  3. Context: এটি Strategy ইন্টারফেসের একটি রেফারেন্স রাখে এবং প্রয়োজন অনুযায়ী Concrete Strategy ব্যবহার করে।

3. Strategy Pattern এর উদাহরণ

ধরা যাক আমাদের একটি Payment System রয়েছে, যেখানে বিভিন্ন ধরনের পেমেন্ট গেটওয়ে (যেমন, ক্রেডিট কার্ড, পে-পাল, বিটকয়েন) ব্যবহার করা হতে পারে। আমরা Strategy Pattern ব্যবহার করে এই পেমেন্ট গেটওয়েগুলিকে ইনক্যাপসুলেট করতে পারি এবং সহজেই নতুন পেমেন্ট গেটওয়ে যোগ করতে পারি।

3.1. Strategy Pattern Implementation Example in Java

// Strategy Interface
interface PaymentStrategy {
    void pay(int amount);
}

// Concrete Strategy: Credit Card Payment
class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;
    private String cardHolder;
    private String cvv;
    
    public CreditCardPayment(String cardNumber, String cardHolder, String cvv) {
        this.cardNumber = cardNumber;
        this.cardHolder = cardHolder;
        this.cvv = cvv;
    }
    
    @Override
    public void pay(int amount) {
        System.out.println(amount + " টাকা ক্রেডিট কার্ড দিয়ে পরিশোধ করা হলো।");
        // বাস্তবায়নের অংশ: কার্ডের মাধ্যমে টাকা লেনদেনের কোড
    }
}

// Concrete Strategy: PayPal Payment
class PayPalPayment implements PaymentStrategy {
    private String email;
    private String password;
    
    public PayPalPayment(String email, String password) {
        this.email = email;
        this.password = password;
    }
    
    @Override
    public void pay(int amount) {
        System.out.println(amount + " টাকা পে-পাল দিয়ে পরিশোধ করা হলো।");
        // বাস্তবায়নের অংশ: পে-পালের মাধ্যমে টাকা লেনদেনের কোড
    }
}

// Concrete Strategy: Bitcoin Payment
class BitcoinPayment implements PaymentStrategy {
    private String walletAddress;
    
    public BitcoinPayment(String walletAddress) {
        this.walletAddress = walletAddress;
    }
    
    @Override
    public void pay(int amount) {
        System.out.println(amount + " টাকা বিটকয়েন দিয়ে পরিশোধ করা হলো।");
        // বাস্তবায়নের অংশ: বিটকয়েনের মাধ্যমে টাকা লেনদেনের কোড
    }
}

// Context Class
class ShoppingCart {
    private List<Item> items;
    private PaymentStrategy paymentStrategy;
    
    public ShoppingCart() {
        this.items = new ArrayList<>();
    }
    
    public void addItem(Item item) {
        items.add(item);
    }
    
    public void removeItem(Item item) {
        items.remove(item);
    }
    
    public int calculateTotal() {
        int total = 0;
        for (Item item : items) {
            total += item.getPrice();
        }
        return total;
    }
    
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    
    public void checkout() {
        int total = calculateTotal();
        paymentStrategy.pay(total);
    }
}

// Item Class
class Item {
    private String name;
    private int price;
    
    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
}

// Client Code
public class StrategyPatternDemo {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        
        Item item1 = new Item("ল্যাপটপ", 50000);
        Item item2 = new Item("মাউস", 1500);
        Item item3 = new Item("কীবোর্ড", 2000);
        
        cart.addItem(item1);
        cart.addItem(item2);
        cart.addItem(item3);
        
        // পেমেন্ট পদ্ধতি নির্বাচন
        PaymentStrategy creditCardPayment = new CreditCardPayment("1234-5678-9012-3456", "জন ডো", "123");
        PaymentStrategy payPalPayment = new PayPalPayment("john.doe@example.com", "password123");
        PaymentStrategy bitcoinPayment = new BitcoinPayment("1A2b3C4d5E6f7G8h9I0j");
        
        // ক্রেডিট কার্ড দিয়ে পেমেন্ট
        cart.setPaymentStrategy(creditCardPayment);
        cart.checkout();
        
        System.out.println("----");
        
        // পে-পাল দিয়ে পেমেন্ট
        cart.setPaymentStrategy(payPalPayment);
        cart.checkout();
        
        System.out.println("----");
        
        // বিটকয়েন দিয়ে পেমেন্ট
        cart.setPaymentStrategy(bitcoinPayment);
        cart.checkout();
    }
}

3.2. উদাহরণের ব্যাখ্যা:

  1. PaymentStrategy: এটি একটি ইন্টারফেস যা pay() মেথড ঘোষণা করে। এটি বিভিন্ন পেমেন্ট গেটওয়েগুলির জন্য একটি সাধারণ ইন্টারফেস প্রদান করে।
  2. Concrete Strategies:
    • CreditCardPayment: ক্রেডিট কার্ড দিয়ে পেমেন্ট করার বাস্তবায়ন।
    • PayPalPayment: পে-পাল দিয়ে পেমেন্ট করার বাস্তবায়ন।
    • BitcoinPayment: বিটকয়েন দিয়ে পেমেন্ট করার বাস্তবায়ন।
  3. ShoppingCart: এটি Context ক্লাস, যা PaymentStrategy এর একটি রেফারেন্স রাখে এবং পেমেন্ট সম্পাদনের জন্য checkout() মেথডে এটি ব্যবহার করে।
  4. Item: এটি একটি সাধারণ ক্লাস যা শপিং কার্টে যুক্ত হওয়া আইটেমগুলির প্রতিনিধিত্ব করে।
  5. StrategyPatternDemo: ক্লায়েন্ট কোড যেখানে আমরা শপিং কার্টে আইটেম যোগ করি, বিভিন্ন পেমেন্ট গেটওয়ে নির্বাচন করি এবং পেমেন্ট সম্পন্ন করি।

3.3. আউটপুট:

50000 টাকা ক্রেডিট কার্ড দিয়ে পরিশোধ করা হলো।
----
50000 টাকা পে-পাল দিয়ে পরিশোধ করা হলো।
----
50000 টাকা বিটকয়েন দিয়ে পরিশোধ করা হলো।

4. Strategy Pattern এর সুবিধা

  1. Loose Coupling: Strategy Pattern ক্লায়েন্ট কোড এবং কনক্রিট স্ট্র্যাটেজি ক্লাসগুলির মধ্যে loose coupling তৈরি করে, যা কোডের পুনঃব্যবহারযোগ্যতা এবং পরিবর্তন সহজ করে তোলে।
  2. বিভিন্ন অ্যালগরিদমের সহজ বিনিময়: বিভিন্ন আচরণ বা অ্যালগরিদম সহজেই পরিবর্তনযোগ্য এবং একে অপরের পরিবর্তে ব্যবহারযোগ্য।
  3. স্বচ্ছ এবং রিচার্জেবল কোড: কোডটি বেশি পরিষ্কার এবং মেইনটেইনেবল হয়, কারণ প্রতিটি স্ট্র্যাটেজি ক্লাসের মধ্যে পৃথক কাজ থাকে।
  4. Runtime এ আচরণ পরিবর্তন: পেমেন্ট পদ্ধতি runtime এ সহজেই পরিবর্তনযোগ্য।

5. Strategy Pattern এর অসুবিধা

  1. বহু ক্লাস: Strategy Pattern ব্যবহার করার ফলে অনেকগুলি ক্লাস তৈরি হতে পারে, যা কোড বেসকে জটিল করতে পারে।
  2. স্ট্র্যাটেজি নির্বাচন: সঠিক স্ট্র্যাটেজি নির্বাচন এবং ব্যবস্থাপনা কিছুটা জটিল হতে পারে, বিশেষ করে যদি অনেকগুলি স্ট্র্যাটেজি থাকে।

6. Strategy Pattern এর ব্যবহার

  • পেমেন্ট সিস্টেম: বিভিন্ন পেমেন্ট গেটওয়ে (ক্রেডিট কার্ড, পে-পাল, বিটকয়েন) পরিচালনা করতে।
  • গেমিং: বিভিন্ন গেমিং কৌশল বা AI আচরণ নিয়ন্ত্রণ করতে।
  • ডাটা প্রসেসিং: বিভিন্ন ডাটা সোর্টিং বা প্রসেসিং অ্যালগরিদম নির্বাচন করতে।
  • গ্রাফিক্স: বিভিন্ন গ্রাফিক্স রেন্ডারিং কৌশল ব্যবহার করতে।

7. Strategy Pattern এর তুলনা অন্য ডিজাইন প্যাটার্নের সাথে

FeatureStrategy PatternState Pattern
Purposeবিভিন্ন অ্যালগরিদম বা আচরণ একে অপরের পরিবর্তে ব্যবহার করাঅবজেক্টের অভ্যন্তরীণ অবস্থা অনুযায়ী আচরণ পরিবর্তন করা
StructureContext, Strategy Interface, Concrete StrategiesContext, State Interface, Concrete States
Behavior Changeক্লায়েন্ট দ্বারা নির্বাচিতঅবজেক্টের অভ্যন্তরীণ অবস্থা দ্বারা পরিবর্তিত
Use Caseপেমেন্ট গেটওয়ে, সোর্টিং অ্যালগরিদমগেম স্টেট ম্যানেজমেন্ট, UI স্টেট পরিবর্তন

সারাংশ

Strategy Pattern হল একটি Behavioral Design Pattern যা বিভিন্ন অ্যালগরিদম বা আচরণগুলিকে একে অপরের পরিবর্তে ব্যবহার করার সুযোগ প্রদান করে। এটি কোডের loose coupling নিশ্চিত করে, পুনঃব্যবহারযোগ্যতা বাড়ায় এবং কোডের readability উন্নত করে। Java তে Strategy Pattern ব্যবহার করে আমরা বিভিন্ন আচরণ বা অ্যালগরিদমগুলি সহজেই বিনিময়যোগ্য এবং নিয়ন্ত্রিত করতে পারি, যেমন পেমেন্ট গেটওয়ে, গেমিং কৌশল, ডাটা প্রসেসিং অ্যালগরিদম ইত্যাদি।

Strategy Pattern এর সাহায্যে, কোডটি আরও নমনীয় এবং রিচার্জেবল হয়, যা সফটওয়্যার ডেভেলপমেন্টে ভালো ডিজাইন এবং মেইনটেইনেবল কোড লিখতে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...