package Ġdesign _ patterns . command . remote _ undo Ċ Ċ import Ġjava . lang . Append able Ċ Ċ interface ĠCommand Ġ{ ĊĠĠĠ Ġfun Ġexecute () ĊĠĠĠ Ġfun Ġundo () Ċ } Ċ Ċ class ĠNo Command Ġ: ĠCommand Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{} ĊĠĠĠ Ġoverride Ġfun Ġundo () Ġ{} Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġthe Ġinvok er Ċ Ġ*/ Ċ class ĠRemote Control With Undo Ġ{ ĊĠĠĠ Ġvar Ġundo Command : ĠCommand Ġ= ĠNo Command () ĊĊĠĠĠ Ġprivate Ġval Ġon Commands Ġ= Ġthis . init iate Commands () ĊĠĠĠ Ġprivate Ġval Ġoff Commands Ġ= Ġthis . init iate Commands () ĊĊĠĠĠ Ġprivate Ġfun Ġinitiate Commands (): ĠArray < Command > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 0 Ġuntil Ġ 7 ). map Ġ{ ĠNo Command () Ġ}. to Typed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Command ( slot : ĠInt , Ġon Command : ĠCommand , Ġoff Command : ĠCommand ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Commands [ slot ] Ġ= Ġon Command ĊĠĠĠĠĠĠĠ Ġoff Commands [ slot ] Ġ= Ġoff Command ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Button Was P ushed ( slot : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Commands [ slot ]. execute () ĊĠĠĠĠĠĠĠ Ġundo Command Ġ= Ġon Commands [ slot ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoff Button Was P ushed ( slot : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoff Commands [ slot ]. execute () ĊĠĠĠĠĠĠĠ Ġundo Command Ġ= Ġoff Commands [ slot ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo Button Was P ushed () Ġ{ ĊĠĠĠĠĠĠĠ Ġundo Command . undo () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstringBuilder : ĠAppend able Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ ĠstringBuilder . append ("\ n ------ ĠRemote ĠControl Ġ------- \ n ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġon Commands . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstringBuilder . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" [ slot Ġ$ i ] Ġ${ on Commands [ i ]. java Class . name } ĠĠĠ Ġ${ off Commands [ i ]. java Class . name } Ċ """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstringBuilder . append ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ[ undo ] Ġ${ undo Command . java Class . name } ĊĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠstringBuilder . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ // region ĠLight Ġwith Ġcommands Ċ class ĠLight ( var Ġlocation : ĠString ) Ġ{ ĊĠĠĠ Ġvar Ġlevel Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġon () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . level Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġprintln (" Light Ġis Ġon ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoff () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . level Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprintln (" Light Ġis Ġoff ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdim ( level : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . level Ġ= Ġlevel ĊĠĠĠĠĠĠĠ Ġif Ġ( level Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . off () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Light Ġis Ġdim med Ġto Ġ$ level % ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠLight Command ( protected Ġval Ġlight : ĠLight ) Ġ: ĠCommand Ġ{ ĊĠĠĠ Ġvar Ġlevel Ġ= Ġ 0 ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . level Ġ= Ġthis . light . level ĊĠĠĠĠĠĠĠ Ġthis . switch Light () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġundo () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . light . dim ( this . level ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSwitch Ġthe Ġ[ light ] Ġon Ġor Ġoff ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġswitch Light () Ċ } Ċ Ċ class ĠLight Off Command ( light : ĠLight ) Ġ: ĠLight Command ( light ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġswitch Light () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . light . off () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLight On Command ( light : ĠLight ) Ġ: ĠLight Command ( light ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġswitch Light () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . light . on () ĊĠĠĠ Ġ} Ċ } Ċ // endregion Ċ Ċ // region ĠCe iling Fan Ġwith Ġcommands Ċ enum Ġclass ĠSpeed Ġ{ ĠOFF , ĠLOW , ĠMED IUM , ĠHIGH Ġ} Ċ Ċ class ĠCe iling Fan ( private Ġval Ġlocation : ĠString ) Ġ{ ĊĠĠĠ Ġvar Ġspeed : ĠSpeed Ġ= ĠSpeed . OFF ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġfun Ġhigh () Ġ{ ĊĠĠĠĠĠĠĠ Ġspeed Ġ= ĠSpeed . HIGH ĊĠĠĠĠĠĠĠ Ġprintln ("$ location Ġce iling Ġfan Ġis Ġon Ġhigh ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmedium () Ġ{ ĊĠĠĠĠĠĠĠ Ġspeed Ġ= ĠSpeed . MEDIUM ĊĠĠĠĠĠĠĠ Ġprintln ("$ location Ġce iling Ġfan Ġis Ġon Ġmedium ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlow () Ġ{ ĊĠĠĠĠĠĠĠ Ġspeed Ġ= ĠSpeed . LOW ĊĠĠĠĠĠĠĠ Ġprintln ("$ location Ġce iling Ġfan Ġis Ġon Ġlow ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoff () Ġ{ ĊĠĠĠĠĠĠĠ Ġspeed Ġ= ĠSpeed . OFF ĊĠĠĠĠĠĠĠ Ġprintln ("$ location Ġce iling Ġfan Ġis Ġoff ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠCe iling Fan Command ( protected Ġval Ġce iling Fan : ĠCe iling Fan ) Ġ: ĠCommand Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġprev Speed Ġ= ĠSpeed . OFF ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġundo () Ġ= Ġwhen Ġ( prev Speed ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSpeed . HIGH Ġ-> Ġce iling Fan . high () ĊĠĠĠĠĠĠĠ ĠSpeed . MEDIUM Ġ-> Ġce iling Fan . medium () ĊĠĠĠĠĠĠĠ ĠSpeed . LOW Ġ-> Ġce iling Fan . low () ĊĠĠĠĠĠĠĠ ĠSpeed . OFF Ġ-> Ġce iling Fan . off () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġprev Speed Ġ= Ġthis . ce iling Fan . speed ĊĠĠĠĠĠĠĠ Ġthis . set Speed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġ[ ce iling Fan ] Ġto Ġthe Ġcorrect Ġspeed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġset Speed () Ċ } Ċ Ċ class ĠCe iling Fan High Command ( ce iling Fan : ĠCe iling Fan ) Ġ: ĠCe iling Fan Command ( ce iling Fan ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset Speed () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ce iling Fan . high () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCe iling Fan Low Command ( ce iling Fan : ĠCe iling Fan ) Ġ: ĠCe iling Fan Command ( ce iling Fan ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset Speed () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ce iling Fan . low () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCe iling Fan Medium Command ( ce iling Fan : ĠCe iling Fan ) Ġ: ĠCe iling Fan Command ( ce iling Fan ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset Speed () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ce iling Fan . medium () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠCe iling Fan Off Command ( ce iling Fan : ĠCe iling Fan ) Ġ: ĠCe iling Fan Command ( ce iling Fan ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset Speed () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ce iling Fan . off () ĊĠĠĠ Ġ} Ċ } Ċ // endregion Ċ Ċ fun Ġmain () Ġ{ ĊĠĠĠ Ġval Ġremote Control Ġ= ĠRemote Control With Undo () ĊĠĠĠ Ġval Ġliving Room Light Ġ= ĠLight (" Living ĠRoom ") ĊĠĠĠ Ġval Ġliving Room Light On Ġ= ĠLight On Command ( living Room Light ) ĊĠĠĠ Ġval Ġliving Room Light Off Ġ= ĠLight Off Command ( living Room Light ) ĊĊĠĠĠ Ġremote Control . set Command ( 0 , Ġliving Room Light On , Ġliving Room Light Off ) ĊĠĠĠ Ġremote Control . on Button Was P ushed ( 0 ) ĊĠĠĠ Ġremote Control . off Button Was P ushed ( 0 ) ĊĠĠĠ Ġprintln ( remote Control ) ĊĊĠĠĠ Ġremote Control . undo Button Was P ushed () ĊĠĠĠ Ġremote Control . off Button Was P ushed ( 0 ) ĊĠĠĠ Ġremote Control . on Button Was P ushed ( 0 ) ĊĠĠĠ Ġprintln ( remote Control ) ĊĊĠĠĠ Ġremote Control . undo Button Was P ushed () ĊĊĠĠĠ Ġval Ġce iling Fan Ġ= ĠCe iling Fan (" Living ĠRoom ") ĊĠĠĠ Ġval Ġce iling Fan Medium Ġ= ĠCe iling Fan Medium Command ( ce iling Fan ) ĊĠĠĠ Ġval Ġce iling Fan High Ġ= ĠCe iling Fan High Command ( ce iling Fan ) ĊĠĠĠ Ġval Ġce iling Fan Off Ġ= ĠCe iling Fan Off Command ( ce iling Fan ) ĊĊĠĠĠ Ġremote Control . set Command ( 0 , Ġce iling Fan Medium , Ġce iling Fan Off ) ĊĠĠĠ Ġremote Control . set Command ( 1 , Ġce iling Fan High , Ġce iling Fan Off ) ĊĠĠĠ Ġremote Control . on Button Was P ushed ( 0 ) ĊĠĠĠ Ġremote Control . off Button Was P ushed ( 0 ) ĊĠĠĠ Ġprintln ( remote Control ) ĊĊĠĠĠ Ġremote Control . undo Button Was P ushed () ĊĠĠĠ Ġremote Control . on Button Was P ushed ( 1 ) ĊĠĠĠ Ġprintln ( remote Control ) ĊĊĠĠĠ Ġremote Control . undo Button Was P ushed () Ċ } Ċ