package ĠStructural ĊĊ Ċ /** Ċ Ġ* Ġ" Smart ĠProxy Ġpattern " Ġin Ġwhich Ġinstead Ġof Ġextending Ġfunctionality Ġstatic ally Ċ Ġ* Ġ Ġvia Ġinheritance , Ġyou Ġopt Ġfor Ġhas Ġa Ġrelationship . Ċ Ġ* Ċ Ġ* Ġ Ġfor Ġeg : Ġin Ġbelow ĠI ce C ream Cake Ġis Ġmade Ġusing Ġblack Ġcurrent , Ġyou Ġcan Ġsimply Ġchange Ċ Ġ* Ġ Ġthe Ġfunctionality Ġby Ġpassing Ġcho colate Ġtomorrow , Ġas Ġget Desc rit ption () Ġchanges Ċ Ġ* Ġ Ġfor Ġeach Ġtype Ġof Ġfl av ours . Ċ Ġ*/ Ċ fun Ġmain (){ ĊĠĠĠ Ġval Ġice C ream Ġ= Ġvan i alla Ice C ream () ĊĠĠĠ Ġval Ġblack current Ġ= ĠBlack Current ( ice C ream ) ĊĠĠĠ Ġval Ġcho colate = Ġcho colate ( ice C ream ) ĊĠĠĠ Ġval ĠI ce C ream Cake = ĠI ce C ream Cake ( black current ) ĊĊĠĠĠ Ġblack current . add Fl avour (" ch ock o Ġch ips ") ĊĊĊĠĠĠ Ġval Ġarr au y Ġ= ĠArrayList < String >() ĊĠĠĠ Ġarr au y . add (" ch oo cko Ġch ips ") ĊĠĠĠ Ġarr au y . add (" black Ġch err ys ") ĊĠĠĠ Ġcho colate . add Fl avour ( arr au y . to Typed Array ()) ĊĊĠĠĠ ĠI ce C ream Cake . add Fl avour (" ch ock o Ġch ips ", 1 0 ) ĊĊĠĠĠ Ġprintln ( black current . get Desc rit ption ()) ĊĠĠĠ Ġprintln ( cho colate . get Desc rit ption ()) ĊĠĠĠ Ġprintln ( Ice C ream Cake . get Desc rit ption ()) Ċ } Ċ Ċ interface ĠI cec ream { Ċ Ġfun Ġst ir S ugar C ream () Ċ Ġfun Ġpour Van ila Extract And Ch ill Mix () Ċ Ġfun Ġpour Mix To Ice C ream Maker And Wait () Ċ Ġfun Ġget Ice C ream Description (): String Ċ } ĊĊ Ċ class Ġvan i alla Ice C ream : I cec ream { ĊĠĠĠ Ġoverride Ġfun Ġst ir S ugar C ream () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" St ir Ġs ugar , Ġc ream , Ġand Ġmil k Ġinto Ġa Ġsa uce pan Ġover Ġlow Ġheat Ġuntil Ġs ugar Ġhas Ġdis solved . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Heat Ġjust Ġuntil Ġmix Ġis Ġhot Ġand Ġa Ġsmall Ġring Ġof Ġfo am Ġappears Ġaround Ġthe Ġedge ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġpour Van ila Extract And Ch ill Mix () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Transfer Ġc ream Ġmixture Ġto Ġa Ġpour able Ġcontainer Ġsuch Ġas Ġa Ġlarge Ġmeas uring Ġcup . ĠSt ir Ġin Ġvanilla Ġextract Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" and Ġch ill Ġmix Ġthorough ly , Ġat Ġleast Ġ 2 Ġhours . Ġ( Over night Ġis Ġbest .) ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġpour Mix To Ice C ream Maker And Wait () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Pour Ġcold Ġice Ġc ream Ġmix Ġinto Ġan Ġice Ġc ream Ġm aker , Ġturn Ġon Ġthe Ġmachine , Ġand Ġch urn Ġaccording Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġmanufacturer 's Ġdirections , Ġ 2 0 Ġto Ġ 2 5 Ġminutes .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Ice C ream Description (): ĠString =" Simple Ġvanilla Ġice Ġc ream " Ċ } Ċ Ċ /** Ċ Ġ* ĠI ce - c ream Ġdecorator Ċ Ġ*/ Ċ abstract Ġclass ĠI ce C ream Fl av ours : I cec ream { ĊĠĠĠ Ġprotected Ġval Ġice c ream : I cec ream ĊĠĠĠ Ġconstructor ( ice c ream : ĠI cec ream ){ ĊĠĠĠĠĠĠĠ Ġthis . ice c ream Ġ= Ġice c ream ĊĠĠĠĠĠĠĠ Ġmake Ice C ream () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġst ir S ugar C ream () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" St ir Ġs ugar , Ġc ream , Ġand Ġmil k Ġinto Ġa Ġsa uce pan Ġover Ġlow Ġheat Ġuntil Ġs ugar Ġhas Ġdis solved . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Heat Ġjust Ġuntil Ġmix Ġis Ġhot Ġand Ġa Ġsmall Ġring Ġof Ġfo am Ġappears Ġaround Ġthe Ġedge ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġpour Van ila Extract And Ch ill Mix () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Transfer Ġc ream Ġmixture Ġto Ġa Ġpour able Ġcontainer Ġsuch Ġas Ġa Ġlarge Ġmeas uring Ġcup . ĠSt ir Ġin Ġvanilla Ġextract Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" and Ġch ill Ġmix Ġthorough ly , Ġat Ġleast Ġ 2 Ġhours . Ġ( Over night Ġis Ġbest .) ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġpour Mix To Ice C ream Maker And Wait () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Pour Ġcold Ġice Ġc ream Ġmix Ġinto Ġan Ġice Ġc ream Ġm aker , Ġturn Ġon Ġthe Ġmachine , Ġand Ġch urn Ġaccording Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġmanufacturer 's Ġdirections , Ġ 2 0 Ġto Ġ 2 5 Ġminutes .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġmake Ice C ream (){ ĊĠĠĠĠĠĠĠ Ġst ir S ugar C ream () ĊĠĠĠĠĠĠĠ Ġpour Van ila Extract And Ch ill Mix () ĊĠĠĠĠĠĠĠ Ġpour Mix To Ice C ream Maker And Wait () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Ice C ream Description (): ĠString Ġ= Ġice c ream . get Ice C ream Description () ĊĠĠĠ Ġabstract Ġfun Ġget Desc rit ption (): String Ċ } Ċ Ċ class ĠBlack Current : Ice C ream Fl av ours { ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfl avour : String ĊĠĠĠ Ġconstructor ( ice c ream : ĠI cec ream ): super ( ice c ream ) ĊĠĠĠ Ġfun Ġadd Fl avour ( fl avour : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fl avour Ġ= Ġfl avour ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Desc rit ption (): ĠString Ġ= Ġget Ice C ream Description ()+" with Ġ$ fl avour " Ċ } Ċ Ċ class Ġcho colate : Ice C ream Fl av ours { ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfl avour : Array < String > ĊĠĠĠ Ġprivate Ġval Ġcherry Ġ= Ġ 4 ĊĠĠĠ Ġconstructor ( ice c ream : ĠI cec ream ): super ( ice c ream ) ĊĠĠĠ Ġfun Ġadd Fl avour ( fl avour : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fl avour Ġ= Ġfl avour ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Desc rit ption (): ĠString { ĊĠĠĠĠĠĠĠ Ġvar Ġdesc Ġ= Ġice c ream . get Ice C ream Description ()+" Ġwith Ġ Ġ" ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġfl avour ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesc += Ġi ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdesc ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ class ĠI ce C ream Cake : Ice C ream Fl av ours { ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfl avour : String ĊĠĠĠ Ġprivate Ġ Ġvar Ġcherry : Int Ġ= Ġ 4 ĊĠĠĠ Ġconstructor ( ice c ream : ĠI cec ream ): super ( ice c ream ) ĊĠĠĠ Ġfun Ġadd Fl avour ( fl avour : ĠString , ch erry : Int ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fl avour Ġ= Ġfl avour ĊĠĠĠĠĠĠĠ Ġthis . ch erry Ġ= Ġcherry ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Desc rit ption (): ĠString Ġ= Ġice c ream . get Ice C ream Description ()+" Ġ$ fl avour Ġwith Ġ$ ch erry Ġch err ys " Ċ } Ċ