Saturday, July 15, 2017

How to make coffee using Java

বলা হয়ে থাকে, প্রোগ্রামার হলো একটি মেশিন যা কফিকে কোডে রূপান্তর করতে পারে। এ থেকেই বোঝা যাচ্ছে কফি অত্যন্ত গুরুত্বপূর্ণ একটি পানীয়।

চলুন তাহলে দেখা যাক কীভাবে এই কফি তৈরি করা যায়?

জাভা দিয়ে কফি তৈরির জন্য প্রয়োজন একটি প্যাটার্ন। এর নাম ডেকোরেটর প্যাটার্ন।

ডেকোরেটর প্যাটার্নের মূল কথা হলো, ডাইনামিক্যালী একটি অবজেক্টে অতিরিক্ত বৈশিষ্ট্যাবলী যুক্ত করা। যেমন- একটি ছবির ফ্রেম। ছবিটি আমাদের মূল অবজেক্ট। এতে একটি ফ্রেম যুক্ত করে একে ডেকোরেট বা অলঙ্কৃত করা। ডেকোরেটার প্যাটার্নে শুরুতে একটি ইন্টারফেস তৈরি করা হয়। এতে একটি মেথড থাকে যা একটি বৈশিষ্ট্য যুক্ত করতে পারে। একটি কনক্রিট ক্লাস থাকে যা ইন্টারফেসটির ইমপ্লিমেন্টেশন। একটি ডেকোরেটর ক্লাস থাকে যাতে ইন্টারফেসটির একটি রেফারেন্স থাকে এবং এটিও ইন্টারফেসটিকে ইমপ্লিমেন্ট করে। এটি সাধরণত একটি অ্যাবস্ট্রাক্ট ক্লাস হয়। এরপর কতগুলো কনক্রিট অ্যাবস্ট্রাক্ট ক্লাস থাকে। একটি উদাহরণ দেওয়া যাক-


1
2
3
public interface Coffee {
    String getIngredient();
}

এর একটি কনক্রিট ক্লাস -


1
2
3
4
5
6
public class CoffeeBean implements Coffee {
    @Override
    public String getIngredient() {
        return "Coffee bean";
    }
}

এবার একটি ডেকোরেটর ক্লাস লেখা যাক -


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public abstract class CoffeeDecorator implements Coffee {
    private final Coffee coffee;

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

    @Override
    public String addIngredient() {
        return coffee.getIngredient();
    }
}

এবার কিছু কনক্রিট ডেকোরেটর লেখা যাক-


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class SaltedCaramelFudge extends CoffeeDecorator {

    public SaltedCaramelFudge(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String addIngredient() {
        return super.getIngredient() + " + Salted caramel fudge";
    }
}
public class SweetenedMilk extends CoffeeDecorator {
    public SweetenedMilk(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String addIngredient() {
        return super.getIngredient() + " + Sweetened Milk";
    }
}
public class VanillaAlmondExtract extends CoffeeDecorator {
    public VanillaAlmondExtract(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String addIngredient() {
        return super.getIngredient() + " + Vanilla/almond extract";
    }
}
public class DarkCookieCrumb extends CoffeeDecorator {
    public DarkCookieCrumb(Coffee coffee) {
        super(coffee);
    }

    @Override
    public String addIngredient() {
        return super.getIngredient() + " + Dark Cookie Crumb";
    }
}

এবার এগুলো দিয়ে কফি তৈরি করা যাক -


1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class CoffeeApp {

    public static void main(String[] args) {

        Coffee coffee = new VanillaAlmondExtract(new SaltedCaramelFudge(new SweetenedMilk(new CoffeeBean())));
        System.out.println(coffee.getIngredient());
    }
}
Output: 
Coffee bean + Sweetened Milk + Salted caramel fudge + Vanilla/almond extract

একটির কনস্ট্রাক্টরে আরেকটি পাস করে করে এভাবে আমরা ডেকোরেটর প্যাটার্ন ব্যবহার করে ডাইনামিক্যালী কফি তৈরি করতে পারি।