Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Tuesday, August 26, 2014

අපේ පළවෙනි java programme එක ලියමු.....part II

කට්ටිය දැන් program එක ගහල බලල ඇති නේද? මොකක් ?? මොන program එකක්ද? කවද කොහෙද කවුද ගැහුවෙ? පළවෙනි වාක්‍ය කියෙව්වම මෙහෙම හිතුණු අය මෙතනින් ගිහිල්ල මගේ කලින් ලිපිය බලල ඉන්නකෝ. ඒකෙ අපි අපේ පළවෙනි java program එක ලිව්වා මතක ඇති. දැන් ඔයාලට ඒ code එක තනියම ගහන්න පුළුවන් ඇති. ඒ විතරක් නෙමෙයි, මම දෙන ඕනෑම වාක්‍යයක් screen එකේ display කරගන්නත් පුළුවන්නෙ නේද? එහෙනම් මෙන්න මේක screen එකේ display කරන්න code එකක් ලියල compile එහෙම කරල run කරලත් බලලම එන්නකෝ මේ ලිපිය කියවන්න කලින්. 

මේක තමා වාක්‍යය..... 

Today, I am going to learn about the first java programme I developed.




ෂාහ්... ඔය කරල තියෙන්නෙ අපූරුවට..... මට පෙනුනේ නෑ. ඒත් ඉතිං මම දන්නව ඔයගොල්ලො දක්ෂයි කියල. 

එහෙනම් අපි අපේ අද මාතෘකාවට බහිමු....ඉස්සෙල්ලම අපි code එක ගමුකො..

public class Test{
        public static void main(String[] args){
               System.out.println("Hello World!"); 
                   }
}


අපි මේ code එකේ මුල්ම වචනෙ ඉඳන්ම පටන්ගමු. මේකෙ මුල්ම වචනෙ තමා public කියන වචනෙ. මේක අපිට පුරුදු වචනයක්නෙ. මේකට අපි කියනව Access modifier එකක් කියල. මේ වගේ access modifiers තව කිහිපයක්ම තියෙනව. ඒව ගැන ඉස්සරහට විස්තර ඇතුව කතා කරනව. දැනට මෙහෙම හිතාගන්නකො, public කියන access modifier එක දාල තියෙන එක හැම කෙනාටම විවෘත්තයි. ඒ කියන්නෙ ඕන කෙනෙක්ට බලන්න පුළුවන්. දැන් මෙතන කාටද මේ public කියල දාල තියෙන්නෙ? ඒක දාල තියෙන්නෙ class Test කියන කෙනාට. 

කවුද දැන් මේ class Test? Class එක ගැන කියන්න ඉස්සෙල්ල මම පොඩ්ඩක් ඊළඟ එක විස්තර කරල ඉන්නම්. ඔයාලට පේනව ඇති ඊළඟට මෙහෙම පේලියක් තියෙනව, 

public static void main(String[] args){ 

මේකට අපි කියනව main method එක කියල. පස්සෙ main thread එක කියලත් කියනව. දැනට main method එක කියල මතක තියාගන්නකො. මේ main method එක program එකක තියෙන වැදගත්ම කොටසක්. මේ main method එක තමයි මුළු program එකම පාලනය කරන්නෙ. මම කිව්වනෙ JVM එක තමයි java program එකක් execute කරන්නෙ කියල. JVM එක program එක execute කරන්න පටන් ගන්නෙ මෙන්න මේ main method එකෙන්. ඔය වචන සෙට් එකට පස්සෙ සඟල වරහනක් තියෙන්නෙ, අන්න ඒ වරහනෙන් තමයි main method එක පටන් ගන්නේ. එතකොට ඔය කලින් තියෙන වචන ගැන පස්සෙ ටික ටික ඉගෙනගන්න පුළුවන්. දැනටම එකක් දන්නවනේ......... හරි එතකොට මේ main method එක පටන් ගන්නෙ ඒ සඟල වරහනෙන් නම් ඉවර වෙන්නෙ කොහෙන්ද?? මම මුලින් දාල තිබුන code එක හොඳට බලන්න මම ලානිල් පාටින් සඟල වරහන් දෙකක් highlight කරල ඇති. එකක් මම කලින් කිව්ව main method එක පටන් ගන්න වරහන. අනිත් එක තමයි ඉවරවෙන එක. ඉතිං මේ වරහන් දෙක ඇතුලෙ තමයි අපිට කරගන්න ඕන වැඩ ටික දෙන්නේ. JVM එක execute කරන්නෙ මේ main method එකනෙ. 

අපි ඔය ඊලග පේලියෙන් ලියල තියෙන්නෙ අපිට කරගන්න ඕනෙ වැඩේ තමයි. ඒ කිව්වෙ මේකෙන්, 

System.out.println(“Hello World!”); 

මේකෙන් අපි කියල තියෙන්නෙ මොකක්ද කියල ඔයාල දැනටමත් දන්නවා. මේකෙන් කියල තියෙන්නෙ Hello World! කියන එක අපේ screen එකේ display කරන්න කියල. හොඳට බලන්න මේ පේලිය අවසන් වෙලා තියෙන්නෙ semicolon “ ;” එකකින් (තිත් කොමාවකින්). මේ වගේ තිත් කොමා වලින් අවසන් වන පේලි වලට අපි කියනව java statement එකක් කියල. අපි මේ statement භාවිතයෙන් තමයි අපිට කරගන්න ඕන වැඩේ පරිගණකයට කියන්නෙ. හුඟක් ආධුනික programmers ලට අමතක වෙන දෙයක් තමයි ඔය semicolon එක. මතක තියාගන්න හැම statement එකක්ම semicolon එකකින් අවසන් වෙන්න ඕනෙ. එහෙම නැත්තම් compile error එකක් දෙනව. මොකද ඉවර කරල නැති statement එයාට තේරෙන්නෙ නෑ. නිකන් අපි මොනව හරි ලියද්දි නැවතීමේ තිත ලියනව වගේ. මම මේ ලිපියෙත් තියන්නෙ. හැබැයි අපිට නම් ඔය තිතක් මගහැරුනොත් ලොකු අවුලක් වෙන්නෙ නෑ. අපිට හිතාගන්න පුළුවන් වාක්‍ය ඉවරයි කියල. ඒත් පරිගණකයට හිතන්න බෑනෙ. ඒ නිසා අපි හරියටම කරන්න ඕනෙ. ඔය මුලින් මුලින් කට්ටියට අමතක උනාට පස්සෙ වෙන මොනව හරි ලියද්දිත් නැවතීමේ තිත වෙනුවට තිත් කොමාව තියන තරමට programmers ල ඕකට පුරුදු වෙනව. 

මෙතනදි System කියන class එකේ තියෙන standard output stream (out) එකට අයත් PrintStream.println(java.lang.String) කියන method එක භාවිත කරල තමයි මේ අපේ වැඩේ කරගන්නෙ. මෙච්චර දේවල් හිතන්න දෙයක් නෑ. මතක තියාගන්නකො මොනවහරි display කරගන්න ඕනෙ නම් System.out.println කියල පටන්ගන්න ඕනෙ කියල. එතකොට තව වැදගත් දෙයක්, ඔය println එකෙන් පස්සෙ තියෙන වරහන් දෙක මැද්දෙ double quotes (“ ”) තුල තමයි අපිට print කරගන්න ඕන දේ type කරන්න ඕනෙ. 

දැන් බලමුකො class එක මොකක්ද කියල. ඇත්තටම මෙතන class එක භාවිත කරල තියෙන විදිහෙන් java වල class කියන සංකල්පය භාවිත වන විදිහ පෙන්නන්න බෑ. මේක සරල කේතයක්නෙ. මේ code එකේ class එකක් භාවිත කරල තියෙන්නෙ main method එක class එකක් තුල තියෙන්න ඕනෙ නිසා. Java වල තියෙන වැදගත්ම සංකල්ප දෙකක් තමයි class සහ object කියන්නෙ. මම සරලව පොඩ්ඩක් විස්තර කරන්නම්. හිතන්නකෝ ඔයාල කාර් හදන කොම්පැනියක ඉන්නේ කියල. සෑම කාර් එකකම දල වශයෙන් සමානකම් තියෙනවනෙ. එන්ජිමක් තියෙනව, රෝද තියෙනව, සීට්...තව එක එක දේවල් තියෙනවනෙ. ඔන්න ඔය හැම එකටම පොදු දේවල් තියෙන නිකන් plan එක වගේ එකක් තමයි class එකක් කියන්නෙ. එතකොට ඔයා කාර් එකක් හදනකොට ඔයාට අවශ්‍ය values දීල ඔයාට අවශ්‍ය ජාතියේ කාර් එකක් හදාගන්න පුළුවන්. උදාහරණයක්‌ විදිහට ඔයාට කාර් එකෙන් කාර් එකට එන්ජින් එකේ සිලින්ඩර් ගාන, engine capacity එක, Suspension වල damping ratio එක සීට් ගාන, පාට වගේ දේවල් වෙනස් කරන්න පුළුවන්නේ. ඒ වගේ විශේෂිත එකක් තමයි object එකක් කියන්නෙ. දැනට ඔය ඇති. 

දැන් අර main method එකට වගේම class එකත් ලියන ක්‍රමයක් තියෙනව. මුලින්ම access modifier එකක් තියෙනවනම් ඒක ලියල class කියල ලියල class එකට නමක් දෙන්න ඕනෙ. මේ program එකේ අපේ class එකේ නම තමයි Test. ඊට පස්සෙ තියෙන සඟල වරහනෙන් තමයි class ඒක පටන් ගන්නෙ. උඩින්ම දාපු code එකේ මම කොළ පාටින් highlight කරල ඇති. කොළපාටින් highlight කරල තියෙන අනිත් වරහනින් තමයි class එක ඉවර වෙන්නෙ. ඒ වරහන් දෙක මැද්දේ තියෙන දේවල් තමයි class එකට අයත් වෙන්නෙ. මෙතන class එකේ නම ගැන කතාකරද්දි පොඩි වැදගත් දෙයක් කියන්න තියෙනව. මතක ඇති මම කලින් ලිපියෙ කිව්ව ඔයාලගෙ source code එක Test.java කියලම save කරන්න කියල. ඒකට හේතුව පස්සෙ කියන්නම් කියලත් කිව්වනෙ. දැන් කියන්න තමයි යන්නෙ. මේ java program ලියද්දි නීති කිහිපයක් තියෙනව. ඒවට අනුකූලව තමයි අපි program එක ලියන්න ඕනෙ. ඉතිං එක නීතියක් තමයි source code එකක public class එකක් තියෙනවනම් ඒ class එකේ නමම source code එකේ නම විදිහට දන්න ඕනෙ කියන එක. අන්න ඒ නිසයි මම ඔයාලට Test.java කියලම save කරන්න කිව්වේ. ඕනෙනම් ඔය public කියන එක මකල දාල වෙන නමකින් save කරන්න හරි, class එකට වෙන නමක් දන්න හරි පුළුවන්. කරලම බලන්නකො... 

අන්තිමට කියන්න තියෙන්නෙ අපි මේ program එක ලියල තියෙන විදිහ ගැන. මුලින්ම බලන කෙනෙක්ට අමුතු විදිහට තමයි පේන්නෙ. Program එකක් කරද්දි අපිට ඕනෙවට එපාවට කරන්න බෑ. ඒ අදාල language එක සම්බන්ධ විවිධ නීති, සම්මුති එහෙම තියෙනව. ඉතිං ඔය class එකක් declare කරගන්න විදිහ, output එකක් print කරන විදිහ, මේවා එක ක්‍රමවේදයකට තමයි ලියන්නෙ. ලෝකෙ කොහේ ඉන්න කෙනෙක් මේ java program එක ලිව්වත් ඔය වචන ටික ඔය පිළිවෙලට තියෙන්න ඕනෙ. Capital, Simple අකුරු, semicolon වෙනස් වෙන්න බෑ. මෙන්න මේ ක්‍රමවේද වලට අපි කියනව syntaxes කියල. හැම දේටම syntax එකක් තියෙනව. ඉතිං අපි ටික ටික ඒව පුරුදු වෙන්න ඕනෙ. අනිත් එක තමයි programming style එක. මේකට නම් නීතියක් නෑ. ඕනෙ නම් ඔය වචන ටික එක පේලියේම ලියාගෙන යන්නත් පුළුවන්. මේ පහල තියෙන්නෙ. 

public class Test{public static void main(String[] args){System.out.println("Hello World!");}}

මෙහෙම ලිව්වා කියල program එකට හානියක් වෙන්නෙ නෑ. නමුත් මේක කියවන්න පුලුවන්ද? බෑ නේද? හදිස්සියේ වැරැද්දක් වෙලා තිබුනොත් හොයාගන්නවත් පුලුවන්ද? Class එක මොකක්ද main method එක මොකක්ද කියලවත් වෙන් කරගන්න බෑ නේද?

public class Test{
       public static void main(String[] args){
                  System.out.println("Hello World!");
       } 
}

මේ code එක කොහොමද? පැහැදිලියි නේද? ඒ නිසා තමයි අපි මෙහෙම ලියන්නෙ. අපි program එකක් ලියන්න ඕනෙ ඕන කෙනෙක්ට කියවන්න පුළුවන් වෙන්න. Programmer කෙනෙක් ගෙ වගකීම වෙන්නෙ program එක ලියන එක විතරක් නෙමෙයි. ඒක maintain කරන්නත් ඕනෙ. හිතන්නකො අපි සමාගමකට software එකක් ලිව්වා කියල. ඒ සමාගම හැමදාම ඒ විදිහටම තියෙන්නෙ නෑනෙ. විවිධ දේවල් වෙනස් වෙනව. උදාහරණයක්‌ විදිහට කිව්වොත් වෙනත් සමාගමක් මිලදී ගන්න පුළුවන්. එතකොට අපේ software එක අදාළ විදිහට වෙනස් කරන්න වෙනව. ඉතිං ආපහු මුල ඉඳන් software එක හදන්න ගියොත් ඒක ලොකු කාලයක් යන වැඩක් වගේම එහෙම කරොත් රස්සාවත් නැති වෙන වැඩක් තමා. ඒ නිසා අපි කරපු program එක වෙනස් කරන්න නම් පැහැදිලිව ලියල තියෙන්න ඕනෙ. එතකොට අපිට අවශ්‍ය කොටස විතරක් හොයාගෙන වෙනස් කරන්න පුළුවන්. ඒ නිසා දැන්ම ඉඳන් පැහැදිලිව program ලියන්න පුරුදුවෙන්න. 

අපි අද කතා කරා අපි ලියපු program එකේ තිබුන දේවල් ගැන. තව programming කරන්න ඕනෙ විදිහ ගැනත් කතා කරා. අපි දැන් ඉදිරියට යන්න සූදානම්. ඊළඟ ලිපියෙන් අපි අළුත් දෙයක් ගැන කතා කරමු. 

Tuesday, July 22, 2014

Java සමග Software Design Patterns

Java සමග Software Design Patterns (5 කොටස | Chain of Responsibility)

java sinhala
මීට පෙර ලිපි වලින් අපි design patterns කිහිපයක් පිලිබඳ අධ්‍යයනය කලා එහිදී design patters හි වැදගත් කම, විවිධ ආකාරයන් ගැන යම් අවබෝධයක් ලබාගන්නට අපිට හැකිවුනා. මෙම ලිපියෙන් අපි සාකච්ඡා කිරීමට බලාපොරොත්තු වන්නේ behavioral pattern එකක් වන "Chain of Responsibility" පිළිබඳවයි.

මේ දිනවල මා හට මෙම pattern එක ප්‍රායෝගිකව භාවිතා කිරීමට අවස්ථාවක් උදාවුනා. එම නිසා එම අවස්ථාව මෙම පාඩමේ උදාහරණයක් ලෙස භාවිතා කිරීමෙන් වඩාත් හොඳ අවබෝධයක් එමගින් ලබාගත හැකිවේවි.

ගැටලුව : දෙන ලද ඩේටා බේස් එකක බැකප් එකක්(dump) ලබාගෙන එය Dropbox නම් online storage එකට අප්ලෝඩ් කල යුතුය. ඊට අමතරව එම බැකප් එක/ඩම්ප් එක ඔන්ලයින් දත්ත ගබඩාවේ සේව් කිරීමට පෙර zip කිරීම කල යුතුය. 

මේ සඳහා එක method එකක් හෝ එක class භාවිතයෙන් වුවත් විසඳුමක් ලබාදිය හැකි බව යමෙකුට සිතන්න පුලුවන්. නමුත් ඉහත අවශ්‍යතාව සඳහා විසඳුමක් ලබාදීමට පෙර පහත කරුණු කෙරෙහි මා විසින් විශේෂ සැලකිල්ලක් දැක්වූවා.

  • ඉදිරියේදී zip කිරීම වෙනුවට tar.gz, 7zip වැනි ආකාරයක් යොදාගැනීමට තීරණය වුවහොත් ඒ සඳහා වැඩසටහනේ සුලු වෙනසක් කිරීම මගින් වඩා පැහැදිලිව එය සිදුකල හැකි වීම
  • එමෙන්ම  Dropbox වෙනුවට වෙනත් online storage එකක්(ftp, sky drive..) යොදාගැනීමට යෝජනා වුවහොත් එයද ඉක්මනින් සහ පැහැදිලිව කිරීමේ හැකියාව තිබීම
  • සමස්ථ ක්‍රියාවලිය එකිනෙකට වෙනස් උප ක්‍රියාවලි කිහිපයකට බෙදා (වෙන වෙනම classes) ඒවා අතර coupling එකද අඩුකිරීමට හැකිවීම
  • මා විසින් ලියන ලද කේතකොටස තවත් අයෙකුට පහසුවෙන් වටහාගැනීමට මෙන්ම ඉදිරියේදී මෙම ක්‍රියාවලියේ යම් වෙනසක් හෝ අලුතෙන් යම් පියවරක් එකතු කිරීමට අවශ්‍ය වුවහොත් විශාල වෙනස් කිරීමකින් තොරව එය ඉතා පහසුවෙන් සිදුකල හැකි වීම.
මුලින් ලබාදී ඇති requirement එකෙහි ඉහත අවශ්‍යතා සෘජුව කියවුනේ නැතත් එවන් තත්වයන්ටද මුහුන දිය හැකිනම් වඩාත් හොඳ නිසා මේ සඳහා design pattern එකක් භාවිතා කර විසඳුමක් ලබාදීම වඩාත් යෝග්‍යයි. ඒ අනුව chain of responsibility මේ සඳහා යෝග්‍ය pattern එකක් ලෙස හඳුනා ගන්න පුලුවන්. 

එම pattern එක ක්‍රියාත්මක වන්නේ pipeline එකක් ආකාරයෙන්. පහත රූපසටහන ආධාරයෙන් එය වඩාත් පහසුවෙන් වටහාගන්නට පුලුවන්.
java
අප තෝරාගත් උදාහරණයට අනුව පහත අනුපිලිවෙලට එම ක්‍රියාවලිය සිදුවිය යුතුය
  1. ඩේට බේස් dump එක සෑදීම
  2. එම dump ෆයිල් එක zip format එකෙන් compress කිරීම
  3. Dropbox එක වෙත එම zip කරන ලද ෆයිල් එක අප්ලෝඩ් කිරීම
  4. ඉහත ක්‍රියාවලියේදී තාවකාලිකව සාදන ලද සියලු ෆයිල් මකාදැමීම හා ක්‍රියාවලිය අවසන් කිරීම.
design pattern එක සඳහා class diagram එක පහත පරිදි වේ.
tutorial
එම design pattern එක යොදාගනිමින් අදාල ගැටලුව විසඳීම සඳහා අපිට පහත පරිදි design එකක් සකස් කල හැක. මා විසින් Handler එක සඳහා තෝරාගන්නා ලද්දේ abstract class එකකි. අවස්ථානුකූලව ඒ සඳහා interface එකක් වුවද යොදාගත හැකිය.
sinhalen java
දැන් අපි මෙය ජාවා යොදාගෙන implement කරන ආකාරය සලකා බලමු.
DBBackupHandler.java
  1. package responsibility;  
  2.   
  3. import responsibility.exception.HandlerFaliureException;  
  4.   
  5. /** 
  6.  * 
  7.  * @author kanishka 
  8.  */  
  9. public abstract class DBBackupHandler {  
  10.   
  11.     private DBBackupHandler nextHandler;  
  12.   
  13.     protected DBBackupHandler getNextHandler() {  
  14.         return nextHandler;  
  15.     }  
  16.   
  17.     protected void setNextHandler(DBBackupHandler nextHandler) {  
  18.         this.nextHandler = nextHandler;  
  19.     }  
  20.   
  21.     abstract void processRequest(BackupRequest request) throws HandlerFaliureException;  
  22. }  
මෙම class එක අදාල pattern එකෙහි හරය ලෙස හැඳින්වුවද වරදක් නැත. අනෙකුත් සියලුම sub task මෙම class එක extend කිරීම අනිවාර්ය වේ. nextHandler property එක මගින් chain එකෙහි ඊලඟ පුරුක(next responsibility) සඳහා reference එකක් පවත්වා ගනී.

ඊලඟට වැදගත් වනුයේ BackupRequest නම් class එකයි. එය data model එකක් ලෙස ක්‍රියාකරයි. responsibility chain එකෙහි ගමන් කරන request එක නියෝජනය කරන්නේ මෙම ක්ලාස් එකයි. මෙහි request එකේ state එක සටහන් කර ගැනීම සිදුකරයි. සියලුම responsibilities හරහා ගමන් කරනුයේ මෙම ඩේටා මොඩ්ල් එකයි.
BackupRequest.java
  1. package responsibility;  
  2.   
  3. import java.io.File;  
  4.   
  5. /** 
  6.  * 
  7.  * @author kanishka 
  8.  */  
  9. public class BackupRequest {  
  10.   
  11.     private BackupStatus status;  
  12.     private String dbName;  
  13.     private File dumpFile;  
  14.     private File zipedDumpFile;  
  15.   
  16.     public BackupStatus getStatus() {  
  17.         return status;  
  18.     }  
  19.   
  20.     public void setStatus(BackupStatus status) {  
  21.         this.status = status;  
  22.     }  
  23.   
  24.     public String getDbName() {  
  25.         return dbName;  
  26.     }  
  27.   
  28.     public void setDbName(String dbName) {  
  29.         this.dbName = dbName;  
  30.     }  
  31.   
  32.     public File getDumpFile() {  
  33.         return dumpFile;  
  34.     }  
  35.   
  36.     public void setDumpFile(File dumpFile) {  
  37.         this.dumpFile = dumpFile;  
  38.     }  
  39.   
  40.     public File getZipedDumpFile() {  
  41.         return zipedDumpFile;  
  42.     }  
  43.   
  44.     public void setZipedDumpFile(File zipedDumpFile) {  
  45.         this.zipedDumpFile = zipedDumpFile;  
  46.     }  
  47. }  
BackupStatus.java
  1. package responsibility;  
  2.   
  3. /** 
  4.  * 
  5.  * @author kanishka 
  6.  */  
  7. public enum BackupStatus {  
  8.   
  9.     INITIALIZED, DUMPED, ZIPED, UPLOADED, COMPLETED  
  10. }  
දැන් අපි බලමු අදාල කාර්යභාරය ඉටුකරන processes නැතහොත් handlers/responsibilities කුමන ආකාරයෙන් පවතිනවාද කියල.
අපගේ උදාහරණයේ මුල්ම responsibility එක වන්නේ database dump කිරීමට අදාල class එකයි.
DumpProcessHandler.java
  1. package responsibility;  
  2.   
  3. import java.io.File;  
  4. import responsibility.exception.HandlerFaliureException;  
  5.   
  6. /** 
  7.  * 
  8.  * @author kanishka 
  9.  */  
  10. public class DumpProcessHandler extends DBBackupHandler {  
  11.   
  12.     public DumpProcessHandler(DBBackupHandler handler) {  
  13.         setNextHandler(handler);  
  14.     }  
  15.   
  16.     @Override  
  17.     void processRequest(BackupRequest request) throws HandlerFaliureException {  
  18.         if (request.getStatus() == BackupStatus.INITIALIZED) {  
  19.             System.out.println("Successfully dumped database : " + request.getDbName());  
  20.             request.setStatus(BackupStatus.DUMPED);  
  21.             request.setDumpFile(new File("001.sql"));  
  22.   
  23.             getNextHandler().processRequest(request);  
  24.         } else {  
  25.             throw new HandlerFaliureException("Invalid backup state!, valid backup status shoule be [" + BackupStatus.INITIALIZED + "] in this stage.");  
  26.         }  
  27.     }  
  28. }  
මෙහිදී parent class එකෙහි ඇති processRequest(BackupRequest) නම් method එක override කිරීම සිදුකිරීම අනිවාර්යයෙන්ම කල යුතුය. අදාල කාර්යය code කරනුයේ මෙම method එක තුලයි. මෙහි model එකෙහි state එක validate කිරීමක්ද සිදුකර ඇති බව ඔබට දැකගත හැකිවනු ඇත. එය අනිවාර්ය නොවූවත් requirement එක මත අවස්ථානුකූලව එය යොදාගැනීම වටී. අදාල කාර්යය සිදුකිරීමෙන් අනතුරුව කරනුයේ ඊලඟ responsibility එක ආරම්භ කිරීමට විධාන කිරීමයි.
ZipProcessHandler.java
  1. package responsibility;  
  2.   
  3. import java.io.File;  
  4. import responsibility.exception.HandlerFaliureException;  
  5.   
  6. /** 
  7.  * 
  8.  * @author kanishka 
  9.  */  
  10. public class ZipProcessHandler extends DBBackupHandler {  
  11.   
  12.     public ZipProcessHandler(DBBackupHandler handler) {  
  13.         setNextHandler(handler);  
  14.     }  
  15.   
  16.     @Override  
  17.     void processRequest(BackupRequest request) throws HandlerFaliureException {  
  18.         if (request.getStatus() == BackupStatus.DUMPED) {  
  19.             System.out.println("Successfully ziped database : " + request.getDumpFile());  
  20.             request.setStatus(BackupStatus.ZIPED);  
  21.             request.setZipedDumpFile(new File("001.sql.zip"));  
  22.             getNextHandler().processRequest(request);  
  23.         } else {  
  24.             throw new HandlerFaliureException("Invalid backup state!, valid backup status shoule be [" + BackupStatus.DUMPED + "] in this stage.");  
  25.         }  
  26.     }  
  27. }  
UploadToDropboxHandler.java
  1. package responsibility;  
  2.   
  3. import responsibility.exception.HandlerFaliureException;  
  4.   
  5. /** 
  6.  * 
  7.  * @author kanishka 
  8.  */  
  9. public class UploadToDropboxHandler extends DBBackupHandler {  
  10.   
  11.     public UploadToDropboxHandler(DBBackupHandler handler) {  
  12.         setNextHandler(handler);  
  13.     }  
  14.   
  15.     @Override  
  16.     void processRequest(BackupRequest request) throws HandlerFaliureException {  
  17.         if (request.getStatus() == BackupStatus.ZIPED) {  
  18.             System.out.println("Successfully uploaded backup file : " + request.getZipedDumpFile());  
  19.             request.setStatus(BackupStatus.UPLOADED);  
  20.   
  21.             getNextHandler().processRequest(request);  
  22.         } else {  
  23.             throw new HandlerFaliureException("Invalid backup state!, valid backup status shoule be [" + BackupStatus.ZIPED + "] in this stage.");  
  24.         }  
  25.     }  
  26. }  
CleanaupHandler.java
  1. package responsibility;  
  2.   
  3. import responsibility.exception.HandlerFaliureException;  
  4.   
  5. /** 
  6.  * 
  7.  * @author kanishka 
  8.  */  
  9. public class CleanUpHandler extends DBBackupHandler {  
  10.   
  11.     @Override  
  12.     void processRequest(BackupRequest request) throws HandlerFaliureException {  
  13.         if (request.getStatus() == BackupStatus.UPLOADED) {  
  14.             System.out.println("Successfully clean up tmp files : " + request.getDumpFile() + "," + request.getZipedDumpFile());  
  15.             request.setStatus(BackupStatus.COMPLETED);  
  16.         } else {  
  17.             throw new HandlerFaliureException("Invalid backup state!, valid backup status shoule be [" + BackupStatus.UPLOADED + "] in this stage.");  
  18.         }  
  19.     }  
  20. }  
මීලඟට සිදුකල යුත්තේ handlers එකට අමුනා responsibility  chain එක සකසා ගැනීමයි. එය නොයෙකුත් ආකාරයන්ගෙන් සිදුකල හැක. මෙමෙ උදාහරණයේදී එය සිදුකරන්නේ BackupProcessor නම් ක්ලාස් එක භාවිතයෙනි.
BackupProcessor.java
  1. package responsibility;  
  2.   
  3. import responsibility.exception.HandlerFaliureException;  
  4.   
  5. /** 
  6.  * 
  7.  * @author kanishka 
  8.  */  
  9. public class BackupProcessor {  
  10.   
  11.     DBBackupHandler initialHandler;  
  12.   
  13.     public BackupProcessor() {  
  14.         buildChainOfResponsibility();  
  15.     }  
  16.   
  17.     private void buildChainOfResponsibility() {  
  18.         initialHandler =  
  19.                 new DumpProcessHandler(  
  20.                 new ZipProcessHandler(  
  21.                 new UploadToDropboxHandler(  
  22.                 new CleanUpHandler())));  
  23.     }  
  24.   
  25.     public void startBackup(BackupRequest reqest) throws HandlerFaliureException {  
  26.         initialHandler.processRequest(reqest);  
  27.     }  
  28. }  
අවසාන වශයෙන් අදාල backup process එක පාලනය කිරීම client class එක මගින් සිදුකෙරේ.
BackupClient.java
  1. package responsibility;  
  2.   
  3. import responsibility.exception.HandlerFaliureException;  
  4.   
  5. /** 
  6.  * 
  7.  * @author kanishka 
  8.  */  
  9. public class BackupClient {  
  10.   
  11.     BackupProcessor processor = new BackupProcessor();  
  12.   
  13.     public void startBackup(BackupRequest request) throws HandlerFaliureException {  
  14.         processor.startBackup(request);  
  15.     }  
  16. }  
ChainOfResponsibilityDemo.java
  1. package chainofresponsibilitydemo;  
  2.   
  3. import responsibility.BackupClient;  
  4. import responsibility.BackupRequest;  
  5. import responsibility.BackupStatus;  
  6. import responsibility.exception.HandlerFaliureException;  
  7.   
  8. /** 
  9.  * 
  10.  * @author kanishka 
  11.  */  
  12. public class ChainOfResponsibilityDemo {  
  13.   
  14.     /** 
  15.      * @param args the command line arguments 
  16.      */  
  17.     public static void main(String[] args) throws HandlerFaliureException {  
  18.         BackupClient client = new BackupClient();  
  19.         BackupRequest request = new BackupRequest();  
  20.         request.setStatus(BackupStatus.INITIALIZED);  
  21.         request.setDbName("paymentDB");  
  22.         client.startBackup(request);  
  23.     }  
  24. }  
output :


Main method එක තුල සිදුකර ඇත්තේ අදාල request object එක සාදාගෙන එය chain of responsibility එකට ඇතුලු කිරීමයි. ඉන් අනතුරුව එය chain එක හරහා ගමන්කරනු ඇත. එහිදී අප විසින් අපේක්ෂා කරන කාර්යය සිදුවේ. යම් හෙයකින් chain එක අතරමැදදී අනපේක්ෂිත ලෙස ඉදිරියට යා නොහැකි අන්දමින් යමක් බිඳවැටුනහොත් එය client class වෙත දැනුම් දීම සඳහා අපට custom exceptions භාවිතා කල හැකිය. මෙම උදාහරණයේ එලෙස එක exception එකක් යොදාගෙන ඇත(HandlerFailureException). 


මෙම ලිපියට අදාල යම් ගැටලු හෝ අපහැදිලි තැන් ඇත්නම් comment ආකාරයෙන් හෝ ඉදිරිපත් කර ඒවා නිරාකරනය ගන්න. මෙහිදී යොදාගත් උදාහරණයට අදාල සියලුම source code පහත දක්වා ඇති git repository එකට පිවිසීමෙන් ලබාගත හැකිය.
මීට පෙර design pattern පිලිබඳව ඇති ලිපි වෙත පහත ලින්ක් තුලින් පිවිසිය හැකිය.