/** Ċ Ġ* ĠThis Ġis Ġa Ġreal Ġworld Ġexample Ġof Ġa Ġsocial Ġmedia Ġapp , Ġit Ġshows Ġhow Ġcan Ġthe ĠIterator Ġdesign Ġpattern Ċ Ġ* Ġhelp Ġyou Ġimplement Ġthe Ġmessaging Ġfeature . Ċ Ġ* Ġ*/ Ċ Ċ /** Ċ Ġ* ĠAn Ġiterator Ġallows Ġto Ġse quent ially Ġaccess Ġthe Ġelements Ġwithout Ġexposing Ġits Ċ Ġ* Ġinternal Ġstructure Ġ. e . g . Ġwhether Ġit 's Ġa Ġlist Ġor Ġa Ġmap . Ċ Ġ* Ġ*/ Ċ interface ĠIterator < out ĠT > Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnext Ġelement Ġin Ġthe Ġiteration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext (): ĠT ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġ` true ` Ġif Ġthe Ġiteration Ġhas Ġmore Ġelements . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Next (): ĠBoolean Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġiterable Ġobject Ġshould Ġcraft Ġits Ġown Ġ* Iterator * Ġimplementation . Ċ Ġ* Ġ*/ Ċ interface ĠIterable < out ĠT > Ġ{ ĊĠĠĠ Ġfun Ġiterator (): ĠIterator < T > Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġmessage Ġobject Ġthat Ġonly Ġcontains Ġtext Ċ Ġ* Ġ*/ Ċ data Ġclass ĠMessage Object ( ĊĠĠĠ Ġval ĠmessageId : ĠString , ĊĠĠĠ Ġval Ġsender Id : ĠString , ĊĠĠĠ Ġval Ġtext : ĠString Ċ ) Ċ Ċ /** Ċ Ġ* ĠA ĠCon versation Ġbetween Ġ 2 Ġor Ġmore Ġpeople Ġthat Ġholds Ġan Ġimmutable Ġlist Ġof Ġmessages . Ċ Ġ* Ġ*/ Ċ class ĠCon versation ( ĊĠĠĠ Ġval Ġconversation Id : ĠString , ĊĠĠĠ Ġval Ġmessages : ĠList < Message Object > Ċ ) Ġ: ĠIterable < Message Object > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Message Object > Ġ= ĊĠĠĠĠĠĠĠ ĠCon versation Iter () ĊĊĠĠĠ Ġinner Ġclass ĠCon versation Iter Ġ: ĊĠĠĠĠĠĠĠ ĠIterator < Message Object > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcursor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠMessage Object Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Conversation . messages [ cursor ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ< Ġthis @ Conversation . messages . size ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA ĠCon versation Manager Ġis Ġan Ġobject Ġused Ġto Ġstore Ġconversation Ġobjects Ġand Ġprovide Ġan Ġinterface Ġto Ġretrieve , Ċ Ġ* Ġdelete Ġand Ġstore Ġmore Ġconversations . Ċ Ġ* Ġ*/ Ċ class ĠCon versation Manager Ġ: ĊĠĠĠ ĠIterable < Conversation > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġconversation Lookup Ġ= ĊĠĠĠĠĠĠĠ ĠHashMap < String , ĠCon versation >() ĊĊĠĠĠ Ġfun Ġput Conversation ( ĊĠĠĠĠĠĠĠ Ġconversation Id : ĠString , ĊĠĠĠĠĠĠĠ Ġmessages : ĠList < Message Object > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconversation Lookup [ conversation Id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCon versation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Conversation ( ĊĠĠĠĠĠĠĠ Ġconversation Id : ĠString ĊĠĠĠ Ġ): ĠCon versation ? Ġ= ĊĠĠĠĠĠĠĠ Ġconversation Lookup [ conversation Id ] ĊĊĠĠĠ Ġfun Ġdelete Conversation ( ĊĠĠĠĠĠĠĠ Ġconversation Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconversation Lookup . remove ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBind Ġa Ġmessage Object Ġto Ġa Ġconversation Ġif Ġit Ġexists . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġbind Message Object ( ĊĠĠĠĠĠĠĠ Ġmessage Object : ĠMessage Object , ĊĠĠĠĠĠĠĠ Ġconversation Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbefore Conversation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Lookup [ conversation Id ] ĊĠĠĠĠĠĠĠ Ġif Ġ( before Conversation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Conversation . messages . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Object ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Conversation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCon versation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconversation Lookup [ conversation Id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Conversation ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Conversation > Ġ= ĊĠĠĠĠĠĠĠ ĠCon versation List Iter () ĊĊĠĠĠ Ġinner Ġclass ĠCon versation List Iter Ġ: ĊĠĠĠĠĠĠĠ ĠIterator < Conversation > Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcursor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠCon versation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Conversation Manager . conversation Lookup . values . toList ()[ cursor ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNoSuch ElementException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ< Ġthis @ Conversation Manager . conversation Lookup . values . size ĊĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠThe ĠEntry Ġpoint Ġof Ġthe Ġprogram Ċ Ġ* Ġ@ param Ġargs Ġthe Ġarguments Ġpassed Ġin Ġthe Ġterminal Ċ Ġ* Ġ*/ Ċ fun Ġmain ( ĊĠĠĠ Ġargs : ĠArray < String > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġmessage 1 Ġ= ĊĠĠĠĠĠĠĠ ĠMessage Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 2 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Hello , ĠHow Ġare Ġyou ?" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġmessage 2 Ġ= ĊĠĠĠĠĠĠĠ ĠMessage Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 7 4 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 2 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" I 'm Ġfine , Ġyou ?" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġmessage 3 Ġ= ĊĠĠĠĠĠĠĠ ĠMessage Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 1 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 3 2 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" good !" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġconversation Manager Ġ= ĊĠĠĠĠĠĠĠ ĠCon versation Manager () ĊĠĠĠ Ġconversation Manager . put Conversation ( ĊĠĠĠĠĠĠĠ Ġ" 2 0 2 ", ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage 3 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġall Con versations Iterator Ġ= ĊĠĠĠĠĠĠĠ Ġconversation Manager . iterator () ĊĠĠĠ Ġval Ġfirst Conversation Ġ= ĊĠĠĠĠĠĠĠ Ġall Con versations Iterator . next () ĊĊĠĠĠ Ġval Ġmessages Iterator Ġ= ĊĠĠĠĠĠĠĠ Ġfirst Conversation . iterator () ĊĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( messages Iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessages Iterator . next () ĊĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Message Ġ${ i ++ }: Ġ${ message . text }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ }