December 19, 2015

Adaptor Pattern

ကွန်ပြူတာ တစ်လုံးဝယ်လာပါသည်။ Three Pin ပလပ်ခေါင်းဖြစ်နေပြီး အိမ်မှာရှိတာက Two Pin ပလပ်ခုံဖြစ်နေတယ်။ အဲ့ဒီနေရာမှာ Three Pin ကနေ Two Pin ကို ပြောင်းပေနိုင်တဲ့ Adaptor တစ်ခုကို ဝယ်ပြီး Three Pin ကို Two Pin အပေါက်မှာ အသုံးပြုလိုက်တယ်။ အစဉ်ပြေသွားပါတယ်။ ကျွန်တော်တို့ Adpator ကို အသုံးပြုခြင်းအားဖြင့် Three Pin Plug ခေါင်းကို Two Pin ပလပ်ပေါက်မှာ အသုံးပြုသွားနိုင်ပါတယ်။


GoF ရဲ့ Adaptor Pattern ဆိုတာလဲ အဲ့ဒီလိုပါပဲ။ အသွင်မတူညီတဲ့ Class တွေကို မူရင်းပုံစံကို ပြုပြင်စရာမလိုပဲ အသုံးပြုနိုင်အောင် ဆောင်ရွက်ပေးနိုင်သော Pattern ဖြစ်ပါသည်။ အောက်ပါ ပြဿနာအား ဖြေရှင်းကြည့်ပါမည်။


Problem


ကုမ္ပဏီတစ်ခုတွင် အသုံပြုနေသော System တစ်ခုတွင် ဝန်ထမ်းမျာအားကိုယ်စားပြုသော Employee Class နှင့် ၎င်းတို့၏ လစာကို တွက်ချက်ပေးနိုင်သော SalaryCalculator Class တို့ရှိကြပါသည်။ Employee Class အတွင်းတွင် တစ်နာရီ၏ လစာကို ဖေါ်ပြပေးနိုင်သော getPayPerHour method နှင့် အလုပ်လုပ်ခဲ့သော နာရီပေါင်းကို ဖေါ်ပြပေးနိုင်သော getHours method တို့ကို ပိုင်ဆိုင်ကြ၏။ တဖန် SalaryCalculator Class အတွင်းတွင် Employee Class အား အသုံးပြုပြီး လစာကို တွက်ချက်ပေးနိုင်သော getSalary method ကို ပိုင်ဆိုင်ပါသည်။ getSalary method သည် Employee Object အား Argument အနေနှင့်ရယူကာ ၎င်း၏ လစာအား တွက်ချက်ပေးပါသည်။ ကုဒ် အနေနှင့် ကြည့်မည် ဆိုပါက အောက်ပါ အတိုင်းဖြစ်ပါမည်။

public double getSalary(Employee emp) {
 return em.getPayPerHour() * emp.getHours();
}

ထိုနောက် အတန်ကြာမှ ကုမ္ပဏီ ဥက္ကဌဖြစ်သော CEO Class ကို လည်း လက်ရှိ SalaryCalculator Class ၏ getSalary နှင့် အသုံးပြုလိုလာပါသည်။ သို့ရာတွင် CEO သည် နာရီစား မဟုတ်သောကြောင့် getMonthSalary method သာ ရှိပါသည်။


ရှိရင်းစွဲကုဒ်များကိုလည်း မပြုပြင်လိုပါ။ CEO Object များကိုလည်း SalaryCalculator Class ၏​ getSalary method ဖြင့် အသုံးပြုလိုပါသည်။ မည်သို့ပြုလုပ်မည်နည်း။


Solution


ထိုကဲ့သို့သော ပြဿနာများတွင် Adaptor Pattern သည် အသုံးဝင်ပါသည်။ SalaryProgram ၏​ getSalary method သည် Employee Object များဆိုပါက အသုံးပြုနိုင်ပါသည်။ ထို့ကြောင့် Employee Class အား Extends လုပ်ထားသော Class တစ်ခုအား တည် ဆောက်ပြီး ၎င်းအတွင်းတွင် CEO Object အား ပါဝင်စေကာ Employee ၏ getPayPerHour နှင့် getHours တို့အား Override လုပ်ကာ ရေးသားရုံသာ ဖြစ်မည်။ နဂိုရှိရင်းစွဲ Employee ကော၊ SalaryProgram ကော၊ CEO ကိုပါ ပြုပြင်စရာ မလိုပဲ အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။


EmployeeAdaptor အတွင်းရှိ getPayPerHour နှင့် getHours method များ၏​ လုပ်ဆောင်ပုံအား Ceo Object အတွင်းမှ Data များဖြင့် မှန်ကန် အောင်တွက်ချက် ထုတ်ပြပေးမည် ဆိုပါက နဂိုရှိရင်းစွဲ၊ Employee, Ceo နှင့် SalaryCalculator များအား ပြုပြင်စရာ မလိုဘဲ အသုံးပြုနိုင်မည် ဖြစ်သည်။


Conclusion


Adaptor Pattern ဆိုသည်မှာ ဆက်စပ်မှု့မရှိသော နဂိုက အသုံပြုလို့မရသော Object မျာအား ရှိရင်းစွဲ ကုဒ်ကို ပြုပြင်စရာ မလိုပဲ အသုံးပြုနိုင်အောင် ဆောင်ရွက်ပေးနိုင်သော Design Pattern တစ်မျိုးဖြစ်ပါသည်။


ဆက်ပါဦးမည်
မင်းလွင်

No comments:

Post a Comment