টেমপ্লেট মেথড ডিজাইন প্যাটার্ন (Template Method Design Pattern)


এর আগে আমরা যারা স্ট্র্যাটেজি ডিজাইন প্যাটার্ন পড়েছি তারা একটা বিষয়ে আগে থেকেই ক্লিয়ার যে , কখনও কখনও আমাদের এপ্লিকেশনে এমন কিছু কাজ করি যার অ্যালগরিদম রান টাইমে চেঞ্জ করে ফেলা যায় । যেমন সর্টিং অ্যালগরিদম এর Array এর সাইজ হিসেব করে  আমরা রান টাইমে সর্টিং অ্যালগরিদম চেঞ্জ করে ফেলতে পারি ।

এখন আমাদের এপ্লিকেশন ডেভেলপের সময় এরকম প্রয়োজন হতে পারে যে, আমরা যে কাজটি (যেমন সর্টিং) করার জন্য অ্যালগরিদম ইউজ করব সে অ্যালগরিদম ঠিকই থাকবে কিন্তু সেই অ্যালগরিদম এর কিছু স্টেপ পরিবর্তন হবে।

ঠিক এরকম কাজ করার জন্য আমরা টেমপ্লেট মেথড ডিজাইন ব্যবহার করি। এই ডিজাইন প্যাটার্নের কাজই হচ্ছে আমাদের ব্যবহৃত অ্যালগরিদম এর কিছু অংশের পরিবর্তন করে একই ধরণের কাজ কাজে একে ব্যবহার করা।

উদাহরণ স্বরূপ আমরা ইমেইল পাঠানোর স্টেপ গুলো টেম্পলেট মেথড ডিজাইন এ ফেলতে পারি।

সাধারণত নিচের স্টেপ গুলো মেনে ইমেইল সেন্ড করা হয়ঃ

  • ইমেইল এড্রেস চেক করা হয় ।
  • মেসেজ এর ভ্যালিডিট চেক করা হয় ।
  • ইমেইলটি সেন্ড করে দেয় হয়।

এখন আমরা একটু ধারণা নিই কোডের মাধমে কিভাবে ইয়াহু মেইল সেন্ড করা যায়ঃ

   
public class EmailYahoo
    {
        public void SendEmail()
        {
            CheckEmailAddress();
            ValidateMessage();
            SendMail();
        }

        private void CheckEmailAddress()
        {
            Console.WriteLine("Checking Email Address : YahooEmail");
        }

        private void ValidateMessage()
        {
            Console.WriteLine("Validating Email Message : YahooEmail");
        }

        private void SendMail()
        {
            Console.WriteLine("Sending Email : YahooEmail");
        }
    }

একই ভাবে গুগলের ইমেইলের জন্যঃ

    public class EmailGoogle
    {
        public void SendEmail()
        {
            CheckEmailAddress();
            ValidateMessage();
            SendMail();
        }

        private void SendMail()
        {
            Console.WriteLine("Checking Email Address : GoogleEmail");
        }

        private void ValidateMessage()
        {
            Console.WriteLine("Validating Email Message : GoogleEmail");
        }

        private void CheckEmailAddress()
        {
            Console.WriteLine("Semding Email : GoogleEmail");
        }
    }

দুইটা class  এ আমরা আসলে একই কাজ বার বার করছি। SendEmail()

মেথডের ভেতরে যে তিনটি মেথড কল করেছি সেগুলোর কাজ একই রকম । তাহলে অবজেক্ট ওরিয়েন্টেড প্রিন্সিপলের ইনহেরিটেন্স ইউজ করে আমরা এর সমাধান করতে পারি । আমরা একটি Abstract class লিখে ফেলতে পারি যেটি হবে যে কোনোও ধরণের ইমেইল সেন্ড করার জন্য একটি অ্যালগোরিদম অথবা Skeleton স্বরূপ ।

তাহলে আমাদের Skeleton/কঙ্কাল হচ্ছে এরুপঃ

   public abstract class EmailBase
    {
        public virtual void SendEmail()
        {
            CheckEmailAddress();
            ValidateMessage();
            SendMail();
        }
        protected abstract void CheckEmailAddress();
        protected abstract void ValidateMessage();
        protected abstract void SendMail();
    }

এখানে দেখা যাচ্ছে আমাদের অ্যালগোরিদম এর স্টেপ গুলো কোনটা কোন অর্ডারে কল হবে সব ঠিক করে দেয়া আছে কিন্তু অ্যালগোরিদম এর স্টেপ গুলো Abstract করে রাখা হয়েছে যাতে যে class এই Base class কে Extend করবে সে ডিফাইন করবেসে এই স্টেপ এ কি করবে ।
অর্থাৎ আমাদের ইমেইল সেন্ড করার জন্য অ্যালগরিদম ফিক্সড কিন্তু অ্যালগরিদম এর স্টেপগুলো ডিফাইন না । যে এই অ্যালগরিদম ইউজ করবে সে তার নিজের মত করে স্টেপ গুলো ডিফাইন করবে । আমাদের ইয়াহু এবং গুগল এর ইমেইলের জন্য কোড গুলো এরকমঃ ইয়াহুর জন্যঃ

    public class EmailYahoo : EmailBase
    {
        public override void SendEmail()
        {
            CheckEmailAddress();
            ValidateMessage();
            SendMail();
        }

        protected override void CheckEmailAddress()
        {
            Console.WriteLine("Checking Email Address : YahooEmail");
        }

        protected override void ValidateMessage()
        {
            Console.WriteLine("Validating Email Message : YahooEmail");
        }

        protected override void SendMail()
        {
            Console.WriteLine("Sending Email : YahooEmail");
        }
    }

গুগলের জন্যঃ

public class EmailGoogle : EmailBase
    {
        public override void SendEmail()
        {
            CheckEmailAddress();
            ValidateMessage();
            SendMail();
        }

        protected override void SendMail()
        {
            Console.WriteLine("Checking Email Address : GoogleEmail");
        }

        protected override void ValidateMessage()
        {
            Console.WriteLine("Validating Email Message : GoogleEmail");
        }

        protected override void CheckEmailAddress()
        {
            Console.WriteLine("Semding Email : GoogleEmail");
        }
    }

তাহলে একে ক্লায়েন্ট কোডে আমরা খুবই সহজে একে ব্যবহার করতে পারি এভাবেঃ

   
class Program
    {
        static void Main(string[] args)
        {
            EmailBase email = new EmailGoogle();//email sending for google mail
            email.SendEmail();

            email = new EmailYahoo();//email sending for Yahoo mail
            email.SendEmail();
        }
    }

এখন মনে করুন কেউ মাইক্রোসফট এর ইমেল ব্যবহার করে ইমেইল সেন্ড করতে চাইলো তাহলে সে শুধু একটি class বানাবে যেটি EmailBase কে এক্সটেন্ড করবে এবং এর স্টেপ গুলো ডিফাইন করে ক্লায়েন্ট কোডে একে ব্যবহার করবে । ব্যস ঝামেলা খতম।
ইহাই হচ্ছে আমাদের টেমপ্লেট মেথড ডিজাইন প্যাটার্ন  🙂

হ্যাপি কোডিং 🙂

 

Advertisements

4 thoughts on “টেমপ্লেট মেথড ডিজাইন প্যাটার্ন (Template Method Design Pattern)

  1. Hello Forhad 🙂

    I was wondering, instead of defining the CheckEmailAddress and ValidateMessage methods in the EmailBase abstract class, why did you keep those abstract?

    I mean, those two parts should be generic, right?

    Like

    1. Hi amit bro
      We don’t know how yahoo or gmail class will implement the valudatemessage and checkemailaddress method, thats why we made them abstract in base class and called them in sendmessage method. Without knowing the implementation we defined the steps/skeleton of email sending algorithm.
      Thus we just made a template , that is template method patt

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s