Java Technologies Decorator Design Pattern Example: Dynamic Object Modification এর জন্য Decorator Pattern গাইড ও নোট

395

Decorator Design Pattern একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন, যা একটি অবজেক্টের আচরণ বা ফাংশনালিটি ডাইনামিকভাবে পরিবর্তন করার জন্য ব্যবহৃত হয়। এটি নতুন ক্লাস তৈরি না করে, একটি অবজেক্টের আচরণকে ডেকোরেটর অবজেক্টের মাধ্যমে কাস্টমাইজ বা প্রসারিত করতে সাহায্য করে।

নিচে একটি উদাহরণ দেওয়া হলো, যেখানে Decorator Pattern ব্যবহার করে একটি অবজেক্টের ফাংশনালিটি ডাইনামিকভাবে পরিবর্তন করা হয়েছে:

Decorator Design Pattern Example

১. বেস ক্লাস (Component)

প্রথমে একটি বেস ক্লাস তৈরি করা হচ্ছে, যেটি একটি সাধারণ ফাংশনালিটি প্রদর্শন করবে।

// Component Interface
public interface Coffee {
    double cost();
}

২. Concrete Component

এটি Coffee ইন্টারফেসের একটি কনক্রিট (Concrete) বাস্তবায়ন যা একটি সাধারণ কফি ক্লাস তৈরি করবে।

// Concrete Component
public class SimpleCoffee implements Coffee {
    @Override
    public double cost() {
        return 5.0; // সাধারণ কফির দাম
    }
}

৩. Decorator Class

এটি Coffee ইন্টারফেসকে ইমপ্লিমেন্ট করবে এবং অন্যান্য ডেকোরেটরের জন্য বেস ক্লাস হিসেবে কাজ করবে।

// Decorator Class
public abstract class CoffeeDecorator implements Coffee {
    protected Coffee decoratedCoffee;

    public CoffeeDecorator(Coffee coffee) {
        this.decoratedCoffee = coffee;
    }

    @Override
    public double cost() {
        return decoratedCoffee.cost();
    }
}

৪. Concrete Decorators

এখন বিভিন্ন ডেকোরেটর ক্লাস তৈরি করা হবে, যেগুলি কফির মূল অবজেক্টের আচরণ পরিবর্তন করবে।

// Concrete Decorator 1: Milk
public class MilkDecorator extends CoffeeDecorator {
    public MilkDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double cost() {
        return super.cost() + 1.5; // দুধ যোগ করলে দাম বৃদ্ধি
    }
}

// Concrete Decorator 2: Sugar
public class SugarDecorator extends CoffeeDecorator {
    public SugarDecorator(Coffee coffee) {
        super(coffee);
    }

    @Override
    public double cost() {
        return super.cost() + 0.5; // চিনি যোগ করলে দাম বৃদ্ধি
    }
}

৫. Client Code

এখানে কিভাবে ডেকোরেটর প্যাটার্ন ব্যবহার করে কফির ফাংশনালিটি পরিবর্তন করা হবে তা দেখানো হয়েছে।

public class DecoratorPatternExample {
    public static void main(String[] args) {
        // সাধারণ কফি তৈরি
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println("Simple Coffee cost: " + simpleCoffee.cost());

        // দুধসহ কফি তৈরি
        Coffee milkCoffee = new MilkDecorator(new SimpleCoffee());
        System.out.println("Milk Coffee cost: " + milkCoffee.cost());

        // দুধ এবং চিনি সহ কফি তৈরি
        Coffee milkSugarCoffee = new SugarDecorator(new MilkDecorator(new SimpleCoffee()));
        System.out.println("Milk and Sugar Coffee cost: " + milkSugarCoffee.cost());
    }
}

Output:

Simple Coffee cost: 5.0
Milk Coffee cost: 6.5
Milk and Sugar Coffee cost: 7.0

ডেকোরেটর প্যাটার্নের ব্যাখ্যা:

  1. Component Interface (Coffee): এটি একটি সাধারণ ইন্টারফেস যা সমস্ত কফি ক্লাসের জন্য নির্দিষ্ট আচরণ ঘোষণা করে। এখানে cost() মেথডের মাধ্যমে কফির দাম পাওয়া যায়।
  2. Concrete Component (SimpleCoffee): এটি Coffee ইন্টারফেসের বাস্তবায়ন এবং একটি সাধারণ কফির দাম প্রদান করে।
  3. Decorator Class (CoffeeDecorator): এটি Coffee ইন্টারফেসে ডেকোরেটরের বেস ক্লাস হিসেবে কাজ করে এবং অন্যান্য ডেকোরেটর ক্লাসে শেয়ার করা ফাংশনালিটি ধারণ করে। cost() মেথডটি ডেকোরেটরের ভিতরে ডেকোরেটেড অবজেক্টের cost() মেথডে কল করা হয়।
  4. Concrete Decorators (MilkDecorator, SugarDecorator): এগুলি CoffeeDecorator ক্লাসের সাবক্লাস এবং কফির মূল অবজেক্টের আচরণ পরিবর্তন করতে নির্দিষ্ট ফাংশনালিটি যোগ করে (যেমন, দুধ এবং চিনি যোগ করা)।
  5. Client Code: এটি বাস্তবে ডেকোরেটর প্যাটার্নের ব্যবহার দেখায়, যেখানে কফি অবজেক্টের উপর ডেকোরেটর যোগ করে ডাইনামিকভাবে নতুন ফাংশনালিটি যুক্ত করা হয়েছে।

Decorator Pattern এর সুবিধা:

  1. কাস্টমাইজেশন: অবজেক্টের আচরণ ডাইনামিকভাবে পরিবর্তন করা সম্ভব, যা সহজেই নতুন ফাংশনালিটি যোগ করার সুযোগ দেয়।
  2. অতিরিক্ত কোড লেখা ছাড়াই: নতুন ক্লাস তৈরি না করে অবজেক্টের আচরণ প্রসারিত করা সম্ভব।
  3. কমপ্লেক্সিটি কমানো: ডেকোরেটর প্যাটার্ন অনেক ছোট ক্লাসে বিভক্ত করা যায়, যা কমপ্লেক্সিটি কমাতে সহায়তা করে।

Decorator Pattern এর ব্যবহার:

  • UI Components: UI কম্পোনেন্টগুলির জন্য, যেমন টেক্সট ফিল্ড, বোতাম ইত্যাদি, যেখানে একাধিক স্টাইলিং বা ফিচার যুক্ত করা যেতে পারে।
  • Logging: যখন আপনি একাধিক লগিং স্টাইলের মধ্যে পরিবর্তন করতে চান, যেমন কনসোল লগিং, ফাইল লগিং ইত্যাদি।
  • Stream I/O: Java I/O প্যাকেজে, যেমন BufferedReader, FileReader ইত্যাদিতে ডেকোরেটর প্যাটার্ন ব্যবহার করা হয় যেখানে একাধিক স্ট্রিমের উপর বিভিন্ন ফিল্টার প্রয়োগ করা হয়।

এটি একটি খুব শক্তিশালী ডিজাইন প্যাটার্ন যা ফ্লেক্সিবিলিটি প্রদান করে এবং অবজেক্টের আচরণ পরিবর্তন বা প্রসারিত করার জন্য নতুন কোডের প্রয়োজনীয়তা কমায়।

Content added By
Promotion

Are you sure to start over?

Loading...