cisc 323 intro to software engineering

CISC 323 Intro to Software Engineering Week 6: Design Patterns CISC - PowerPoint PPT Presentation

CISC 323 Intro to Software Engineering Week 6: Design Patterns CISC 323 Intro to Software Engineering Lecture 6-1 Introduction to Design Patterns


  1. ๏ฟฝ โœซ โœฝ โœต โœง โœผ โœญ โœช โœถ โœง โœญ โœง โœฎ โ€โ โœดโœพ โœซ โœซ โœง โœด โœฎ โœพ โœผ โ‚ โˆ โ‰ โœช โœฟ โ† โœฝ โœง โœผ โœถ โœฎ โœง โœฅ โœซ โœ โœง โœด โœฎ โœฟ โœฑ โ€ โœฝ โœด โœผ โœช โ€ โœง โœผ โœฝ โœฎ โœพ โˆ โ‡ โœซ โ โš โช โ™ โณโจ โฑ โณโจ โฉ โ› โฒ โœ โฉ โณโจ โณโจ โฉ โž โฉ โณ โœ โฉ โก โฉ โณ โœ โš โฉ โ——โ˜ โ‹ โ‹ โ— โ— โ‡ โโ–  โ–  โŠ โ‡ โ โ‘ โ† โ–ฒ โˆ โ—† โ–ผ โŠ โ โ โ โ‡ โโ–  โ–  โŠ โ‡ โ โœธ โœซ โœด โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ’ โœ“ โœ’ โœฅ โœ• โ˜ž โœง โ˜Ž โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜› โœ” โœž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ“ โœ’ โœฉ โœ› โœซ โœง โœธ โœง โœป โœฒ โœง โœซ โœฎ โœผ โœง โœฑ โœผ โœฝ โœบ โœง โœซ โœฎ โœช โœซ โœธ โœด โœซ โœธ โœง โœง โœณ โœซ โœญ โœง โœซ โœง โœฌ โœง โœญ โœง โœฑ โœง โœด โœซ โœธ โœง โœฎ โœน โœถ (2) publish = raiseEvent Exchange Publisher Rate $Cdn cost of connectAsTarget (1) subscribe = Subscriber hotel Event-Connector โœ—โœคโœฃ Implementation โœ˜โœšโœ™ โดโœคโก โœชโ˜…โœซ โ™โœคโซ โ——โญโฌ โœฎโœฐโœฏ โœตโœทโœถ โฏโœทโฒ โœตโœทโœถ โ…โœคโŠ โฏโœทโฒ โ…โœคโ†โ‡ โฏโœทโฑ โƒโœคโ„ โœตโœทโœถ โฏโœทโฒ โœตโœทโœถ โ™โ˜…โš โœชโ˜…โœซ โœฆโ˜…โœง โœบโœคโœพ โœฒโœคโœณ โ–โœคP โดโœคโต

  2. ๏ฟฝ โ˜Žโœ† โœ– โœ โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Code for Target (Subscriber) Interface // Target implements this method. It is called by the // event connector whenever a new event is fired. public interface EventTarget { public void performEvent (EventObject e); } โœ—โœคโœฃ โœ˜โœšโœ™

  3. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ˜ ๏ฟฝ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ” โœ  โœก โ˜Ž โœ† โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Code for New Event Type import java.util.EventObject; public class ExchangeRateChangedEvent extends EventObject { private float newExchangeRate; public int getNewExchangeRate () { return newExchangeRate; } public ExchangeRateChangedEvent ( Object source, float newRate) { super (source); newExchangeRate = newRate; } } โœ—โœคโœฃ โœ˜โœšโœ™

  4. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœž ๏ฟฝ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ™ โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โœ” โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜Žโœ† โœž โ˜ž โœŒ โœ โœ  โœŽ โœ โœ‘ โœŽโœ’ โœ“ โœ’ EventConnector (Publisher) Code public class EventConnector { //There are zero or more targets represented as a vector private Vector targets = new Vector(); // When a new event is raised, the "performEvent" method of // each target is invoked public void raiseEvent (EventObject e) { for (int i=0; i<targets.size(); i++) { EventTarget t = (EventTarget) targets.elementAt (i); t.performEvent (e); } } //Each target must register itself as a target of this //connector. public void connectAsTarget (EventTarget targetComponent) { targets.add(targetComponent); } } โœ—โœคโœฃ โœ˜โœšโœ™

  5. โœ“ ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ‚ โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ› โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœ” โœ† โœ  โœก โ˜Ž โœŸ โœž โ˜ž โœŒ โœ โœŽ โœ โœ  โœ‘ โœŽโœ’ โœ“ โœ’ More on Publish/Subscribe Basis of the Event-based Architectural Style โ€ข โ€ข Greatly improves modifiability and extendibility of systems โ€“ At the expense of interaction complexity โ€“ which may make analysis more difficult โ€ข Used in most (all) graphical user interface frameworks โ€ข Also very popular in development environments (e.g. IBM Eclipse) where a variety of tools can be easily integrated โœ—โœคโœฃ โœ˜โœšโœ™

  6. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ ๏ฟฝ โœ’ โœ” โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ“ โœ  โœก โ˜Ž โœ† โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ ๏ฟฝ โœŽ โœ โœŒ โ˜ž Sequence Diagram Publisher Subscriber1 Subscriber2 connectAsTarget connectAsTarget raiseEvent (change in state initiated by outside source or Publisher) performEvent performEvent โœ–โœฃโœข โœ—โœ™โœ˜

  7. ๏ฟฝ โ˜Žโœ† โœ• ๏ฟฝ โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ ๏ฟฝ โœ’ โœ” โœ– โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ“ โœก โ˜Ž โœ  โœž โœ โœ’ ๏ฟฝ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Where do Design Patterns Come From? โ€ข Actually mined from code โ€“ General rule -- design pattern must be seen in at least three real systems before it is considered to be a design pattern โœ–โœฃโœข โœ—โœ™โœ˜

  8. ๏ฟฝ โœป โœ— โœ โœ‚โœท โœ โœธ โœ• โœน โœบ โœ‘ โœ  โœ— โ˜Ž โœ‚ โœผ โœ‚ โœ  โœ‚โœฝ ๏ฟฝ โœ  โœ‘ โœ‘ โœ โœ โœฟ โœ โœ– โœ โœš โœฃ โœ’ โœ›โœฌ โœญ โœฎ โœš โœฏ โœ› โœฅ โœฐ โœช โœฑ โœ• โœฐ โœฒ โœšโœณ โœฑ โœง โœœ โœš โœฃ โœฆ โœš โœถ ๏ฟฝ โœž โ€ โœซ โœน โœ• โ„โ… โœ โœ• โœ– โ† โœฟ โœบ โœ โœฟ โœž โœ– โœ‘ โœบ โœน โœ’ โœ• โœ– โœ โœ โœฟ โœ  โ˜Ž โœ‘ โœ‘ โœ• โ โœ โœผ โœ— โœ โœ‚โœท โœ โœ‚ โ€ โœ’ โœ  โœฟ โœฟ โœ‚ โƒ โœ– โ‚ ๏ฟฝ โœ– โœ• โœฟ โœž โœ  โœ‚ โœ โœฟ โœ• โœš โœฆ โœš โœž โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โ˜Žโœ† โœ„ โœ” โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ ๏ฟฝ โœ’ ๏ฟฝ โœช โœ• โ˜ž โœก โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โœž โ˜ž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ ๏ฟฝ โœ’ โœ“ โœž โœ— โœ• โœ” โœ› โœ” โœ• โœ— โœฃ โœ– โœ  โœ– โœ โœ• โœ  โœ˜ โœ‘ โ˜Ž โœ— โœ— โ˜Ž โœ โœ โœ— โœž โœฆ โœŒ โœ‚ โœฉ โ˜… โœ› โœฃ โœง โœš โœฆ โœž โœ  โ˜› โ˜› โœ‘ โœ โœก note: this text uses C++/Smalltalk, UML-like notation pages for each design pattern listed on web & slides โœฆโœตโœด โœžโœ“โœ– Bahrami mentions design patterns, no details pages for publish/subscribe pattern: 293-303 Reading โœžโœ“โœ– Supplementary text for this topic: โœ–โœฃโœข โœ‘โœ“โœ’ โœŽโœโœ โœ—โœ™โœ˜ โœคโœโœฅ โœŒโ˜Žโœโœ† โœœโœโœข โœกโœ โ˜žโ˜› โ˜Žโœโœ– โœ™โœโœš โœŸโœ„โœ  โ˜Žโœโœ† โœโœ„โœ‚ โœพโœ“โœ† โ€ข โ€ข โ€ข โ€ข โ€ข

  9. CISC 323 Intro to Software Engineering Lecture 6-2 Adapter, Faรงade, Abstract Factory, and Flyweight Design Patterns

  10. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ ๏ฟฝ โœ’ โœ” โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ“ โœ† โœก โ˜Ž โœ  โœž โœ โœ’ ๏ฟฝ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Adapter Design Pattern [Gamma et al., pp 139-150] โ€ข Motivation โ€“ Sometimes a class implements functionality similar to what an application requires, but not the correct interface for that application โ€“ E.g. We wish to implement a BookList class implementing a list of text book used in a course int getNumBooks() Book getBook (int n) void addBook (Book newBook) โ€“ These operations are very similar to the operations in the predefined Vector class โœ–โœฃโœข โœ—โœ™โœ˜

  11. ๏ฟฝ โ˜ž โœŒ โœ โœž โœŒ โ˜ž โœ† โ˜ž โœŒ โ˜ž โœ โœ โ˜› โœ โœŒ โœžโœŸ โœ†โœ โœ˜ โœ โœ‚ โœ™ โœ  โœ โœŒ โ˜ž โœ’ โœ“ โœ โœ– โœ— โ˜ž โœ โœ โœž โœ  โœ โœž โ˜ž โœ  โœŸ โœ โœ’ โœ โœ โœ‘ โœ โœŽ โœ’ ๏ฟฝ โœ’ โœž ๏ฟฝ โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โ˜› โœ“ โ˜Ž โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ’ โ˜ž โœš โ˜Ž โœž โœ  โœš โœŸ โœšโœœ โœ˜ โœ„ โœž โ˜Žโœ† โœ„ โ˜ž โœ› โœ˜ โœž โœš โœ โœ— โœ– โœ– โœ• โœ” โœŒ Adapter Design Pattern โ€“ Adapt Vector to BookList interface โ€“ Implement BookList from scratch โœ–โœฃโœข โœ“โœ•โœ” โœ—โœ™โœ˜ โ€“ Use Vector โœ โ˜Žโœก Options: โœ‚โ˜Žโœ„ โ€ข

  12. ๏ฟฝ โœ’ โœ  โ˜ž โœ โœค โœž โœ  โœž โœŒ โœ โœ” โœŸ โœ” โœ— โœ โœ’ ๏ฟฝ โœ’ โœš โœ โœ โœž โœš โœ‘ โœŒ โœ  โœ โœ” โœ‘ โœ โ˜ž โœ‘ โœ” โœ– โœž โœŒ โœ’ โœ โœŸ โœ” โœ— โœ โœ โœ  โœž โœž โ˜› โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โœž โ˜Ž โœšโœœ โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ ๏ฟฝ โœ’ โœ“ โœž โœ˜ โœ„ โœž โ˜Žโœ† โ˜Ž โœ„ โœ› โ˜ž โœ˜ โœš โœ— โœ– โœ– โœ• โœ” โ˜ž Two ways of adapting the Vector โœ–โœฃโœข โœ—โœ™โœ˜ โ€“ Object adapter Adapter โ€“ Class adapter โ€ข

  13. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โœ‚ โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ ๏ฟฝ โœ’ โœ” โ˜ž โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โœž โœ“ โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ ๏ฟฝ โœ’ โœ–โœฃโœข Class Adapter โœ—โœ™โœ˜

  14. ๏ฟฝ โ˜Žโœ† โœ• โœ‚ โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ ๏ฟฝ โœ’ โœ” โœ– โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœ“ โ˜Ž โœก โœž โœ โœ’ ๏ฟฝ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Class Adapter BookList.java public interface BookList { public int getNumBooks(); public Book getBook(int n); public void addBook(Book newBook); } โœ–โœฃโœข โœ—โœ™โœ˜

  15. import java.util.Vector; public class BookListClassAdapter extends Vector implements BookList { public int getNumBooks() { return size(); } public Book getBook(int n) { BookListClassAdapter.java return (Book) elementAt(n); } public void addBook(Book newBook) { for (int i=0; i<getNumBooks(); i++) { Book b=getBook(i); if (b.isSameBook (newBook)) { b.setQuantity (b.getQuantity() + newBook.getQuantity()); return; } } add (newBook); } }

  16. ๏ฟฝ โ˜Ž โœ” โœ• โœ– โœ โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Žโœ† โ˜ž โœž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš ๏ฟฝโœ’ ๏ฟฝ โ˜ž โœ– โœ“ โ˜Ž โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž ๏ฟฝ โœ† โœ  โœก โœŸ โ˜› โœŽ โœž โœŽ โœ‘ โœ ๏ฟฝโœ’ โœ โœŒ โ˜ž โœ  SampleClient.java // This code simply shows how a book list is instantiated public class SampleClient { public static void main (String [] args) { Book b = new Book (โ€ฆ); BookList bl = new BookListClassAdapter (); bl.addBook (b); System.out.println (โ€œBook list has โ€ + bl.getNumBooks() + โ€œ booksโ€); } } โœ–โœฃโœข โœ—โœ™โœ˜

  17. ๏ฟฝโœ’ ๏ฟฝ โœ„ โœ† โœ„ โœ† โœ ๏ฟฝ ๏ฟฝโœ’ โœŸ โœš โœž โœ  โœ‚ โœšโœœ โœ˜ โœ„ โœ‚ โœก โ˜Žโœ† โœž โ˜… โœฅ โœค โœขโœฃ โœ™ โœ โœก โ˜› โœ  โœž โœ‚ โœ’ โœ‘โœ„ โœŒโœ โ˜ž โœž โœš โ˜Ž โ˜› โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โœž โ˜Ž ๏ฟฝโœ’ โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ„ โœŽ ๏ฟฝ โœ” โœ› โœ˜ โœž โœš โœ— โœ– โœ– โœ• โœฉ โ˜ž โœ“ โ˜ž Class Adapter โ€ข Adapter simply inherits operations of Vector โ€ข Clients use BookList interface, not BookListClassAdapter directly โœ“โœโœ”โœ• โœšโœœโœ› โœฆโœโœง โœ–โœ˜โœ— โœŸโœโœŽ โœ‚โ˜Žโœ„ โœโ˜Žโœž โœ โ˜Žโœ„ โœ–โœฃโœข โœ—โœ™โœ˜

  18. ๏ฟฝ โœ„ โœ“ โœ” โœ• โœ• โœ– โœ™ โœ โœ— โœš โœ‚ โœ„โ˜Ž ๏ฟฝ โœ โœ‚ โœ— โœ™โœ› โœ™ โœŸ โœ โœ™ ๏ฟฝโœ‘ ๏ฟฝ โ˜› โ˜› โœ’ โœ„ โœ โœ‚ โœ„ โœ„โ˜Ž โœ† โœ โœž โ˜Ž โœŸ โœ  โœก ๏ฟฝ โœ โœŸ โ˜› โ˜ž โœŒ โœ โœŽ โœ โœ ๏ฟฝโœ‘ General Form of Class Adapter โœ•โœขโœœ โœ–โœ˜โœ—

  19. ๏ฟฝ โœ„ โœ“ โœ” โœ• โœ• โœ– โœ™ โœ โœ— โœš โœ‚ โœ„โ˜Ž ๏ฟฝ โœ โœ‚ โœ— โœ™โœ› โœ™ โœŸ โœ โœ™ ๏ฟฝโœ‘ ๏ฟฝ โ˜› โ˜› โœ’ โœ„ โœ โœ‚ โœ„ โœ„โ˜Ž โœ† โœ โœž โ˜Ž โœŸ โœ  โœก ๏ฟฝ โœ โœŸ โ˜› โ˜ž โœŒ โœ โœŽ โœ โœ ๏ฟฝโœ‘ โœ•โœขโœœ Object Adapter โœ–โœ˜โœ—

  20. import java.util.Vector; public class BookListObjectAdapter implements BookList { Object Adapter private Vector books = new Vector(); public int getNumBooks() { BookListObjectAdapter.java return books.size(); } public Book getBook(int n) { return (Book) books.elementAt(n); } public void addBook(Book newBook) { for (int i=0; i<getNumBooks(); i++) { Book b=getBook(i); if (b.isSameBook (newBook)) { b.setQuantity (b.getQuantity() + newBook.getQuantity()); return; } } books.add (newBook); } }

  21. ๏ฟฝ โœ„ โœ” โœ• โœ• โœ โœ™ โœ โœ— โœš โœ‚ โœ„โ˜Ž โ˜› โœ โœ‚ โœ— โœ™โœ› โœ™ โœŸ โœ โœ™ ๏ฟฝโœ‘ ๏ฟฝ โœ“ โœ– โ˜› โœก โœ‚ โœ„ โœ„โ˜Ž โœ† โœ โœž โœ’ โœŸ โœ  โœ„ โ˜Ž โœ โœŽ โœŸ ๏ฟฝโœ‘ โœ โœ ๏ฟฝ โœ โœŒ โ˜ž โ˜› SampleClient.java // This code simply shows how a book list is instantiated public class SampleClient { public static void main (String [] args) { Book b = new Book (โ€ฆ); BookList bl = new BookListObjectAdapter (); bl.addBook (b); System.out.println (โ€œBook list has โ€ + bl.getNumBooks() + โ€œ booksโ€); } } โœ•โœขโœœ โœ–โœ˜โœ—

  22. ๏ฟฝ โœ„ โœ“ โœ” โœ• โœ• โœ– โœ™ โœ โœ— โœš โœ‚ โœ„โ˜Ž ๏ฟฝ โœ โœ‚ โœ— โœ™โœ› โœ™ โœŸ โœ โœ™ ๏ฟฝโœ‘ ๏ฟฝ โ˜› โ˜› โœ’ โœ„ โœ โœ‚ โœ„ โœ„โ˜Ž โœ† โœ โœž โ˜Ž โœŸ โœ  โœก ๏ฟฝ โœ โœŸ โ˜› โ˜ž โœŒ โœ โœŽ โœ โœ ๏ฟฝโœ‘ General Form of Object Adapter โœ•โœขโœœ โœ–โœ˜โœ—

  23. ๏ฟฝ โœ„ โœ” โœ• โœ• โœ โœ™ โœ โœ— โœš โœ‚ โœ„โ˜Ž โ˜› โœ โœ‚ โœ— โœ™โœ› โœ™ โœŸ โœ โœ™ ๏ฟฝโœ‘ ๏ฟฝ โœ“ โœ– โ˜› โœก โœ‚ โœ„ โœ„โ˜Ž โœ† โœ โœž โœ’ โœŸ โœ  โœ„ โ˜Ž โœ โœŽ โœŸ ๏ฟฝโœ‘ โœ โœ ๏ฟฝ โœ โœŒ โ˜ž โ˜› Relation to Quality Attributes โ€ข Modifiability โ€“ Adapter class provides clean interface to clients of adapted object โ€ข Reusability โ€“ Takes advantage of adapted class for reuse โ€ข Correctness โ€“ Takes advantage of tested code โœ•โœขโœœ โœ–โœ˜โœ—

  24. ๏ฟฝโœ โ˜Ž โœ• โœ– โœ‚ โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Žโœ† โ˜ž โœž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš ๏ฟฝโœ’ ๏ฟฝ โœ” โœ– โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ“ โœก โ˜Ž โœ  โœž โœ ๏ฟฝ โœ  โœŽ โœ‘ ๏ฟฝโœ’ โœŽ โœ โœŒ โ˜ž The Faรงade Pattern [Gamma et al., pp 185-193] โ€ข Motivation โ€“ Sometimes part of a system is itself implemented as a subsystem, consisting of a set of objects โ€“ Rather than revealing subsystem structure to rest of system, use faรงade object to provide interface to subsystem as a whole โœ–โœฃโœข โœ—โœ™โœ˜

  25. ๏ฟฝ โ˜Ž โœ โœ• โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Žโœ† โ˜ž โœž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš ๏ฟฝโœ’ ๏ฟฝ โ˜ž โœ” โœ“ โ˜Ž โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  ๏ฟฝ โœก โ˜› โœž ๏ฟฝโœ’ โœŽ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  Facade โœ–โœฃโœข subsystem classes General Idea client classes โœ—โœ™โœ˜

  26. ๏ฟฝ โœ โœŒ โœŽ โœŒ โœ• โœŽ โœ  โœ โœž โ˜ž โ˜žโœŒ โœ โœŽ โœ โœ‘ โœ›โ˜žโœŒ โœ โœž โœ– โœœ โœ โœž โœ™ โœ‘ โœŒ โœš โœŽ โœŽ โœ โœ›โ˜Ž โ˜› โœ‚ โœ โœž โ˜ž โœ‘ โœž โœ— โ˜ž โœ‘ โœŒ โœ’ โœ โœ– โœ›โ˜Ž โœ˜ โœŽ โœ  โœ โœž โ˜ž โœž โœ™ โœ‘ โœŒ โœš โœŽ โœ โœ โœ โœ• โœ• โœš โœŽ โœ โœ›โ˜Ž โœ โœ‘ โœŽ โœŒ โœŽ โœŒ โœ โœŽ โ˜Ž โœ‘ โœ โœ‘ โœŽ โœŒ โœŽ โœš โœ• โœŽ โœ  โœ โœž โ˜ž โœŒ โœ™ โœ‘ โœ  โœŽ โœŒ โœŽ โœŒ โœž โœ โœ  โœ โœž โœข โœ• โœŽ โœ โœž โœž โ˜ž โœž โœ– โœฃ โ˜Ž โœ• โœ‘ โœ โœ‘ โœ โœ‘ โ˜ž โœŽ โœ  โ˜žโœŒ โœšโœœ โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โ˜Žโœ† โœž โœ„ โœ˜ โœš โœ– โœ  โœž โœš ๏ฟฝโœ’ ๏ฟฝ โœ โœ‚ โœž โ˜Ž โœ โ˜ž โœ– โœ• โœ โœž โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜› โœ  โœ” โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽ ๏ฟฝโœ’ ๏ฟฝ โœ“ โ˜ž โ˜ž โ˜žโœŒ โœ โœŽ โœ‘ โœ  โœ โœž โ˜ž โœž โ˜Ž โœ’ โ˜žโœŒ โœž โœ โœ  โœ โœž โœ โ˜žโœŒ โœ โœŽ โ˜› โœ‘ โœŒ โœ– โœ‚ โœ โ˜ž โ˜Ž โœ’ โœ• โœŽ โœ‚ โœŽ โ˜› โœ‘ โœŒ โ˜Ž โœ’ โ˜žโœŒ โœ• โœž โœ  โœ โœ– โ˜ž โœž โ€“ A student information system provides access to The Faรงade Pattern โœโœ†โ˜ž โ€“ Implemented via three classes โœ‘โœ”โœ“ โœ„โœ†โ˜ž โ˜›โœ†โ˜žโœŒ โœ–โœฃโœข โ˜›โœ†โ˜žโœŒ โœโœ†โ˜ž โœ—โœ™โœ˜ โœ‘โœ”โœ“ functions on โ˜›โœ†โ˜žโœŒ โœ‘โœ”โœ“ โœโœกโœ  โœโœŸโœž Example โ˜›โœ†โ˜žโœŒ โœ„โœ†โ˜Ž โœ„โœ†โ˜Ž โœ„โœ†โ˜ž โœโœกโœ  โ€ข

  27. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ— โœš โœ โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ โœ โœ’ โœ” โœž โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ“ โœž โœŸ โœ† โœ  โœก โ˜Ž โœ โœž โ˜ž โœŒ โœ โœ  โœŽ โœ โœ‘ โœŽโœ’ โœ โœ’ Student Information System Classes class Courses { Courses.java โ€ฆ public StudentList getEnrollment (CourseId c) { โ€ฆ } โ€ฆ } class Students { Students.java โ€ฆ public CourseList getCourses (StudentId s) { โ€ฆ } } class Facilities { Facilities.java โ€ฆ public LectureHallId getLectureHall (CourseId c) { โ€ฆ } } โœ–โœฃโœข โœ—โœ™โœ˜

  28. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ โœ โœ’ โœ’ โœ” โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โœ“ โ˜Ž โœž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ โœ’ Student Information System without Faรงade Student Information Subsystem โœ–โœฃโœข โœ—โœ™โœ˜

  29. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ โœ โœ’ ๏ฟฝ โœ” โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โœ“ โ˜Ž โœž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ โœ’ Student Information System with Faรงade Student Information Subsystem โœ–โœฃโœข โœ—โœ™โœ˜

  30. ๏ฟฝ โ˜Žโœ† โœ• โœ– โœ– โœ— โœš โœ‚ โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ โœ โœ’ โœ” โœž โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœ“ โœŸ โœ† โœ  โœก โ˜Ž โœž โœž โœ’ โ˜ž โœŒ โœ โœ  โœŽ โœ โœ‘ โœŽโœ’ โœ Faรงade Implementation StudentInformationSystem.java public class StudentInformation System { Courses cs; Students ss; Facilities fs; โ€ฆ public StudentList getEnrollment (CourseId c) { return cs.getEnrollment (c); } public CourseList getCourses (StudentId s) { return ss.getCourses (s); } public LectureHallId getLectureHall (CourseId c) { return fs.getLectureHall (c); } } โœ–โœฃโœข โœ—โœ™โœ˜

  31. ๏ฟฝ โœŽ โœ“ โœ† โœ“ โœ• โœ† โœ” โœžโœ“ โœ  โœ’ โœ  โœ‘ โœž โœ  โœ โœ„ โœŸ โœž โœž โœŸ โœŒ โœ† โœž โœ โœž โœŒ โœŸ โ˜ž โœ† โ˜› โœ„ โœ† โœ  ๏ฟฝ โœœ โœ˜ โœ˜ โœ  โœŽ โœ  โœก โœ† โœข โœŒ โœŒ โœž โœŒ โœ โœ† โœ โœ โœ“ โœ„ โ˜› โœก โœ“ โœ˜ โœ˜โœ™ โœ— โœ  โœ† โ˜ž โœŸ โœŒ โœ  โœ› โœก โœ† โœก โœ โœ— โœ– โœ– โœ• โœ” โ˜ž โ˜ž โœ“ โœ’ โœ โœŽโœ’ โœ‘ โœ โœŽ โœŒ โœ  โœŸ โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœ† โ˜ž โœ  โœก โ˜Ž โ˜› โœž โœ  โœš โœž โœ˜ โœ  โœžโœŸ โœ โœ† โœ โœ’ โœ› โœ’ โœš โœž โœ โœš โœž โœ„ โ˜Ž โ˜Žโœ† โœž โœ„ โœ˜ โœšโœœ Relation to Quality Attributes โ€ข Modifiability โ€“ By removing external links to subsystem components, impact of changes to subsystem components limited to subsystem itself โ€ข Performance โ€“ Slight performance cost of extra call indirection through faรงade โœ‚โ˜Žโœ„ โœ–โ˜Žโœ— โ˜žโ˜Žโœš โœ–โœฃโœข โœ—โœ™โœ˜

  32. ๏ฟฝโœ โœช โ‘ โœฎ โ—† โœง โœฆ P โœฐ โœฑ โœท โœฐ โœณ โœฌ โ– โœฌ โœซ โ—† โœญ โ‘ โœฅ โœฌ โœฑ โ–ผ P โœฐ โœฑ โœช โœท โœณ โœฌ โ– โœช โœฑ โœฐ โœฏ โ‘ โœถ โœฌ โ‘ โœญ P โœง โ–ฒ โœฐ โ‹ โœพ โ€ โ โŠ โœฟ โœผ โˆ โƒ โœผ โœฝ โœพ โœฝ โœพ โ€ โ€ โˆ โœฟ โ€ โœฝ โ โ‘ โœฌ โœญ โœฎ โ โœฎ โœช โœณ โœฏ โœฆ โœฒ โœฝ โœง โœฑ โœญ โœฆ โœฎ โœง โœฑ โœฅ โŠ โœฅ โ—† โŠ โœฅ โœฆ โœถ โœฌ โœซ โœฏ โ‘ โœช โœง โœฌ โœซ โœชโœญ โ—† โœฐ โœฎ โ—† โœญ โœฆ โ™ โœท โœฌ โœฐ โœฌโœญ โœฌ P โœฎ โœซ โœฒ โ‘ โœช โœง โœฐ โœธ โœฎ โ‘ โœฑ โœฌ โœฏ โœณ โœง โœฑ โ–ผ โ‘ โœช โœฐ โœช โœญ โœฑ โœฒ โœง โœฆ โœญ โ‘ โœฐ โœท โœช โœฑ โœฐ โœช โœญ โ‘ โ—† โ–ผ โœช โœฌ โœฐ โœฏ โœฌ โœฌ โœญ โœฎ โœช โ‘ โœณ โœญ โœฑ โœณ โœฌ โœฐ โœฌ โœฉ โœฅ โœญ โœฐ โœช โœฐ โœฐ โœ‚ โ โœฝ โœฌโœญ โœฉ โœฌ โœญ โœฏ โœช โœฌ โœญ โœฎ โœฉ โœฐ โœซ โœช โœฉ โœฅ โœ’ โœ“ โœ’ โœ› โœฌ โœฑ โœ  โœฐ โœซ โœพ โœฐ โœฌ โœง โœฌ โœด โœณ โœฌ โœซ โœฉ โœฅ โœฌโœญ โœญ โœญ โœฑ โœซ โœฒ โœž โœ› โœฏ โ˜Ž โœ โœŽ โœ โœŒ โ˜ž โœ  โœž โ˜› โœก โœŽโœ’ โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‘ โœ“ โœ›โœข โœž โœ™ โœ„ โœž โ˜Žโœ† โ˜Ž โœ„ โœœ โœ™ โœ› โœ’ โœ˜ โœ— โœ— โœ– โœ• โ˜ž โ˜ž โœ” โœต โœฑ โœซ โœบโœป โ โœพ โ‹ โœฟ โœป โœพ โœฝ โœผ โœน โ โ‚ โœป โœพ โœฝ โ‹ โŠ โœฝ โœพ โ— โ‹ โœฝ โ โœผ โŠ โ–  โŠ โœพ โˆ โ€ โˆ โ‹ โ โœน โ… โœป โ‹ โœป โœฟ โ„ โœฝ โœป โœผ โˆ โœฌ โ‹ โœฝ โœพ โ„ โœพ โƒ โ‚ โ โœฝ โœฟโ€ โœป โœฝ โ โœผ โœบโœป โœน โœธ โœฌ โœซ โœท โœฆ โœถ โ โ… โœป โ โ† โƒ โŠ โœฝ โœฟ โœผ โˆ โœพ โ€ P โˆ โ‰ Another Example: SavitchIn โœ—โœคโœฃ โœฆโ˜…โœง โœฆโ˜…โ–ผ โœฟโ‡โ† โœ˜โœšโœ™ Input with Java API: SavitchIn: โœฌโ˜โ—— โœฆโ˜…โœง โ€ข โ€ข

  33. ๏ฟฝ โœ› โœง โœฆ โœฅ โœ’ โœ“ โœ’ โœž โœช โœ  โœ› โœ โœ›โœข โœ™ โœ„ โœž โ˜…โœฉ โœซ โ˜Ž โœฒโœณ โœฉ โœฆ โœถ โœต โœด โœฐ โœฐ โœซ โœฌโœญ โœช โœช โœฏ โœซโœฎ โ˜… โœง โœซ โ˜Žโœ† โœฐ โœ„ โœ  โœ“ โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœž โœœ โ˜› โ˜Ž โœ„ โœก โœ  โœ† โœŸ โœž โœ โœ’ โ˜Žโœ† โ˜Ž โ˜ž โœ™ โœž โœ› โœ‚ โœ˜ โœ— โœ— โœ– โœ• โ˜ž โœ” Categories of Patterns โ€ข The patterns we have seen so far address structural problems in programs โ€“ Adapter -- structures programs to aid reuse โ€“ Faรงade -- localizes references to a subsystem, aiding modifiability โ€ข Also interesting are โ€“ Creational patterns -- help in object creation โ€“ Behavioural patterns -- help manage runtime behaviour of program โ˜…โœฑโœฐ โœ—โœคโœฃ โœ˜โœšโœ™

  34. ๏ฟฝ โœฝ โœบ โœด โœป โœฅ โœง โœฉ โœช โœน โœซ โœฐ โœช โœซ โœฌ โœฎ โœฆ โœธ โœซ โœฐ โœ โœช โœฏโœฑ โœฌ โœฐ โœช โœด โœด โœฌ โœต โœฐ โœถ โœง โœท โœช โœฐ โœฌ โœฒ โœฐ โœช โ‡ โœพ โœง โœท โœฌ โœฌ โœญ โœถ โœฟ โœง โœง โœฉ โœฏ โœต โœง โœช โœพโœฟ โœง โœง โœฉ โœซ โœด โœฏ โ โœญ โœฎ โœต โ€ โœช โœฏโœฑ โœฌ โœช โœฏ โœฐ โ˜ž โœ‘ โœŽโœ’ โœ“ โœ’ โœ” โ˜ž โœ• โœŽ โœ– โœ— โœ— โœ˜ โœ› โœฏ โœ โœ โœœ โœŸ โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœ† โœŒ โœ  โœก โ˜Ž โ˜› โœž โœ  โ˜ž โœ™ โœž โœ„ โœ’ โœฉ โœง โœฌ โœญ โœฎ โœฅ โœฌ โ˜Ž โœ’ โœซ โœ“ โœ› โœซ โ˜Žโœ† โœž โœ„ โœญโœง โœ™ โœ›โœข โœ› โœซ โœ  โœž โœช Abstract Factory [Gamma et al., pp. 87-95] โ€ข Motivation โ€“ Imagine you have a book ordering system in which you need to maintain a list of books โœฎโœณโœฒ โœฆโ˜…โœง โœฐโƒโ‚ โ„โ†โ… โœผโœฆโ˜…โœง โ€“ Initially, you wish to maintain a simple Vector โ€“ However, after the system has been delivered, you decide you want a data structure that also permits books to be represented in sorted order โœ—โœคโœฃ โœ˜โœšโœ™

  35. import java.util.Vector; public class BookListClassAdapter extends Vector implements BookList { public int getNumBooks() { return size(); } Here is an initial implementation of a public Book getBook(int n) { BookList return (Book) elementAt(n); } public void addBook(Book newBook) { for (int i=0; i<getNumBooks(); i++) { Book b=getBook(i); if (b.isSameBook (newBook)) { b.setQuantity (b.getQuantity() + newBook.getQuantity()); return; } } add (newBook); } }

  36. ๏ฟฝโœ โ€ โœฑ โœฐ โœฌ โ€ โ† โœถ โœฌ โœฑ โœด โœณ โœณ โ„ โœป โœฌ โ€ โœณ โœถโœท โœฏ โŠ โœช โœป โ€ โœณ โœฑ โœณ โ„ โœธ โœถ โœณ โ€ โœณ โœป โœป โ… โœฏ โœณ โ€ โœณ โœต โ‰ โ‡ โœถ โœฌ โœฑ โœธ โ… โœถ โœด โœฑ โœฌ โœฎ โ‚ โœธ โœฑ โœฐ โœฏ โœถ โœฌ โœธ โœฐ โœฎ โœถ โœฟ โœป โœด โœด โœฏ โœฐ โœฎ โœถ โœฟ โ… โœถ โœฏ โœฏ โœฐ โ† โœถ โœฏ โœต โœธ โœธ โœฎ โ† โœต โ โœฑ โ€ โœณ โ… โœฑ โ‰ โœณ โ„ โœฏ โ€ โœฑ โœณ โ โœฏ โœณ โ€ โœฎ โœถ โœฑ โ‹ โ‹ โœด โœฏ โœณ โ€ โœท โœฌ โ€ โ† โœธ โœถ โœณ โ€ โœณ โœด โœด โœป โ โœฎ โœถ โœฏ โœถ โœณ โœธ โœถ โœฑ โœฏ โœต โ† โœธ โœฑ โ‰ โœด โ โœณ โœฐ โƒ โœฌ โ€ โœป โœฑ โœฌ โœธ โœณ โœป โœป โœฑ โ… โœต โœธ โœฑ โ‰ โœด โœณ โœฑ โœซ โœบ โœฌ โœฌ โœน โœป โœฌ โœด โœถ โ€ โœถ โ… โœธ โœถ โœฑ โ€ โœฏ โœณ โ† โ† โœฏ โ‚ โœฑ โœธ โœฐ โœฏ โœถ โœฌ โœฑ โœธ โœฎ โœถ โœฟ โœป โœฑ โœถโœท โœ‚ โœฏ โœบ โœฌ โœฌ โœน โœฌ โœธ โœณ โœถโœท โœต โœฑ โœฎ โœณโœด โœฒ โœฑ โœฐ โœฎโœฏ โœช โ˜…โœฉ โœฅ โœซ โœด โœ“ โœฅ โœณ โœฏ โœฟโ€ โœฌ โœพ โœช โœฉ โ˜…โœฝ โœผ โœฐโœป โœธ โœณ โœด โœธ โœฑ โœด โœด โœฏ โœฐ โœฎ โœ’ โœ’ โœฌ โ˜› โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โœž โ˜Ž โœ’ โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ“ โœ” โœ› โœ„ โœž โœ  โœ› โœ›โœข โœ™ โœ„ โœž โ˜Žโœ† โ˜Ž โœœ โ˜ž โœ™ โœž โœ› โœ˜ โœ— โœ— โœ– โœ• โ˜ž โœธ โœฎ โœน โœต โœธ โœด โ‚ โœด โƒ โœฟ โœด โ€ โœณ โœธ โ โœฌ โœฏ โ€ โœท โœฌ โ€ โ† โ€ โœณ โœต โœณ โœด โœฌ โ โœต โœฎ โœธ โœฏ โœต โœธ โœฌ โœด โ‡ โœฏ โœฌ โ€ โœท โœฌ โ€ โ† โœณ โ โœฏ โœด โœป โœธ โœณ โœฌ โœฏ โœบ โœฌ โœฏ โœน โœช โœณ โœฐ โƒ โœฐ โœฑ โœฑ โœฏ โ„ โœฏ โœณ โƒ โœธ โœฌ โœซ โ โ‚ โœด โœฌ โœบ โœฌ โœซ โœถ โœฑ โœฑ โ… โœณ โœด โœด โœฟ โœธ โœณ โƒ โ‚ โœฏ โ โœธ โœถ Adding sorting behavior to the BookList class โ€“ Option 1: Modify BookList so that every time a book is entered, the Vector is sorted โโœดโˆโ‡ Abstract Factory โœ—โœคโœฃ โœ˜โœšโœ™ โœซโœญโœฌ โœฆโœคโœง โ€ข

  37. ๏ฟฝ โ˜Žโœ† โœ• โœ โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ โœ โœ’ โœ” โœ– โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ“ โœก โ˜Ž โœ  โœž โœ โœ’ โœ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Abstract Factory โ€ข Option 2: โ€“ Create a BookList interface with the required functionality of maintaining a list of books โ€“ Create an abstract factory class that creates an instance of the correct kind of BookList โœ–โœฃโœข โœ—โœ™โœ˜

  38. ๏ฟฝ โœข โ˜ž โœง โ˜ž โœก โ˜› โœ โ˜› โœ  โœ™ โœก โœฉ โœ” โœ‚ โœฆ โœŸ โœ โœชโœซ โœฅ โœŸ โœ‚ โœฆ โœ‚ โ˜Ž โœš โœง โœž โ˜ž โœฆ โœ’ โ˜Ž โœ† โœ โœž โœŸ โœ  โœ“ โ˜› โœ• โœ“ โœ  โœ  โœง โœ” โœš โ˜ž โ˜… โ˜ž โœ’ โ˜› โœ™ โœ โœ†โœ โœŸ โœŸ โœ“ โ˜Ž โœ†โœ โœž โœŸ โœ” โœ โœ™ โ˜… โœ  โœ˜ โ˜ž โœ“ โœค โœ โœš โœ™ โœ™ โœœ โœ— โœ“ โœ™ โœ โ˜› โœฌ โœ‚ โœค โœ โœ’ โœ˜ โœ˜ โœ“ โœ“ โœ™ โœ โ˜› โœฌ โœŽ โœ— โœก โ˜› โœฆ โœ  โœ™ โœก โœ โœš โœ  โœข โœฏ โœฃ โœ† โœฐ โœ‚ โœ‚ โœฅ โœž โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โ˜Žโœ† โœ„ โœ” โœ˜ โœšโœœ โœš โœ  โœž โœš โœ’ โœ โœ’ โœ‚ โ˜Ž โœ• โ˜ž โœž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โœž โ˜ž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ โœ’ โœ“ โœ†โœ ๏ฟฝ โœ“ โœ™ โœŸ โœ˜ โœ™โœ” โ˜ž โœ โœ โ˜› โœ  โœ™ โœก โœ“ โœŽ โœ โœ  โœ โœš โœ  โœ“ โ˜› โœ™ โœŽโœ› โœ™ โœ™ โœœ โœ“ โœข โœ โ˜ž โœ— โœ’ โœ โœ“โœ” โœ– โ˜ž โœ’ โœ  โœŽ โœ  โ˜ž โœ“ โ˜› โœ• โ˜ž โœ โ˜ž โ˜ž โœ–โœฃโœข BookList variants โœ—โœ™โœ˜ โ˜›โœฎโœญ โœ โœ„โœก โœโœ„โœ‚ โœŽโœ‘โœ โœ”โœ“โœฒโœฑ โ˜›โœŒโ˜ž โœโœ„โœ‚ โœ โœ„โœก โœฃโœ„โœค โœโœ„โœ‚ โœ โœ„โœก โ˜›โœŒโ˜ž โœฃโœ„โœค โœโœ„โœ‚ โœŽโœ‘โœ

  39. ๏ฟฝโœ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ‚ โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ› โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœ” โœ† โœ  โœก โ˜Ž โœŸ โœž โœ’ โ˜ž โœŒ โœ โœ  โœŽ โœ โœ‘ โœŽโœ’ โœ“ Problems with Changing Implementations โ€ข Problem: If we change from the VectorBookList to SortingVectorBookList implementation, need to ensure that wherever we create a book list, we replace โ€œnew VectorBookList() โ€ with โ€œ new SortingVectorBookList() โ€ โ€ข This could be a large change โ€“ What if source to classes creating book lists is not available? โœ—โœคโœฃ โœ˜โœšโœ™

  40. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž ๏ฟฝ โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โ˜ž โ˜ž โœ” โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜› โœž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ“ โœ’ โœ—โœคโœฃ Abstract Factory โœ˜โœšโœ™

  41. ๏ฟฝ โœก โœŒ โœซ โ˜Ž โ˜› โœ  โ˜ž โ˜Ž โœ  โœฑ โœ“ โœ“ โ˜ž โœฅโœญ โœ— โœœ โœ โœ• โœง โœ  โœŸ โœ• โœ โ˜Ž โ˜› โœŽ โœฑ โœ  โœ  โœก โœฐ โœŸ โœ โœŒ โœก โœค โœฌ โœŸ โœŸ โœž โœ  โœ“ โœ โœŸ โ˜Ž โœŒ โ˜› โœ  โœ„ โœŒ ๏ฟฝ โœก โ˜Ž โœ โœ  โœฏ โœœ โœœ โœ› โœ™โœš โœ˜ โœ— โœฎ โœ โœ› โ˜Ž โœ™โœš โœ˜ โœ— โ˜Ž โœฑ โœ• โœ โ˜Ž โœ โœ โ˜Ž โœ โ˜ž โœ“ โ˜Ž โœŒ โœ  โœŸ โœŒ โœก โœฅโœญ โœ— โœœ โœค โœง โœฌ โœ“ โœ  โœ› โœœ โœ› โœ™โœš โœ˜ โœ— โœฅ โœ— โœค โœ โœฆ โœท โœ• โœ โœ“ โ˜Ž โœก โœœ โœ™โœš โ˜ž โœก โœ โœซ โœ โ˜ž โœต โœŒ โ˜Ž โœ— โœŸ โœŸ โœ โœก โœŒ โœด โœ โœ• โœ˜ โœ˜ โœ  โœ— โœฅ โœ— โœœ โœค โœฆ โœท โœข โœ™โœš โ˜Ž โœŸ โ˜Ž โœถ โœ โœœ โœ› โœŽ โœŒ โœ โœ’ โœž โ˜Ž โœ‚ โœ โœ’ โœ“ โœ› โœŸ โœž โœ  โœ› โœ›โœข โœ™ โœ„ โœž โ˜Ž โœ โœก โ˜Ž โœ“ โ˜Ž โœŸ โœ  โœก โœ โœŒ โœก โ˜› โ˜Ž โœ โœŽ โœ โœŒ โ˜Žโœ โ˜ž โ˜Žโœ† โœ„ โœŒ โœ  โ˜ž โœ  โœž โ˜› โ˜Ž โœก โœ† โœ โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ โœŒ โœŽ โœœ โœ– โœ™ โœž โœ› โœ˜ โœ— โœ— โœ• โœ โ˜ž โ˜ž โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœ  โœœ โ˜Ž โ˜Ž โœค โœฆโœง โœœ โœฆ โœ  โœ— โœ˜ โœ™โœš โœ› โœฅโœญ โœ— โœœ โ˜…โœฉ โœช โœŒ โœŒ โœœ โœฌ โœœ โœ› โœ™โœš โœ˜ โœ— โ˜Ž โœ„ โœ„ โœŒ โœ• โœ โœซ โœ โœค โœฅ โœ“ โœ˜ โœ โ˜ž โœ โœ“ โœŒ โœ  โœ โœก โ˜Ž โœ โœ• โœ  โœ— โœ„ โœ™โœš โœ› โ˜› โ˜› โœ  โœ โœก โœŒ โœง โ˜ž โœฎ โœ—โœคโœฃ Abstract Factory โœ„โœ†โ˜Ž โœ˜โœšโœ™ โ˜žโœ”โœ“ โœŒโœ’โœ‘ โœŒโœ’โœฏ โœ„โœ†โ˜Ž โœ–โœ”โœ— โœ–โœ”โœ— โœ„โœ†โ˜Ž โœŒโœ’โœฐ โœœโœฃโœข โœ–โœ”โœ— โœ–โœ”โœ— โ˜žโœณโœฒ โœ–โœ”โœ— โœŒโœ’โœฏ โ˜žโœ”โœ“ โœ„โœ†โ˜Žโœ โ˜žโœ”โœ“ โœ„โœ†โ˜Ž โœ–โœ”โœ— โœ–โœ”โœ— โœ–โœ”โœ—

  42. BookListFactory BookListFactory.java public interface BookListFactory { public BookList createBookList (); } class VectorBookListFactory implements BookListFactory { public BookList createBookList () { return new VectorBookList (); } VectorBookListFactory.java } class Client { Client.java โ€ฆ BookListFactory blf; โ€ฆ BookList b = blf.createBookList(); }

  43. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœ โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœž โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ” โœž โœŸ โœ† โœ  โœก โ˜Ž โœ โœž โœ โœ  โœ’ โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Extending to Multiple Factories uses BookListFactory Client uses <<interface>> VectorBookListFactory SortingVectorBookListFactory BookList creates creates VectorBookList SortingVectorBookList The client is provided with an object of type BookList . This object may be either a VectorBookList or a SortingVectorBookList , depending on which factory was used. โœ—โœคโœฃ โœ˜โœšโœ™

  44. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› ๏ฟฝ โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœž โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ” โœž โœŸ โœ† โœ  โœก โ˜Ž โœ โœž โœ โœ  โœ’ โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Extending to Multiple Factories uses BookListFactory Client uses <<interface>> VectorBookListFactory SortingVectorBookListFactory BookList creates creates VectorBookList SortingVectorBookList The client is provided with an object of type BookList . This object may be either a VectorBookList or a SortingVectorBookList , depending on which factory was used. โœ—โœคโœฃ โœ˜โœšโœ™

  45. ๏ฟฝโœ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœž โœ‚ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ™ โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ” โœž โœŸ โœ† โœ  โœก โ˜Ž โœ โœž โœ โœ  โœ’ โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Extending to Multiple Factories uses BookListFactory Client uses <<interface>> VectorBookListFactory SortingVectorBookListFactory BookList creates creates VectorBookList SortingVectorBookList The client sees an object of type BookListFactory , so does not need to know whether it is using a VectorBookListFactory or a SortingVectorBookListFactory โœ—โœคโœฃ โœ˜โœšโœ™

  46. General Form of Abstract Factory

  47. ๏ฟฝ โ˜Žโœ† โœ– โœ“ โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Relating to Quality Attributes โ€ข Modifiability โ€“ Increased through use of indirection in creation process โ€“ Creator does not need to know exactly what type of object is being created โœ—โœคโœฃ โœ˜โœšโœ™

  48. ๏ฟฝโœ โ˜Žโœ† โœ• โœ– โœ– โœ‚ โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โ˜ž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ โœ’ โœ โœ” โœ— โ˜ž โœž โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ“ โœ  โ˜Ž โ˜› โœก โœ  โœ‘ โœ โœ’ โ˜ž โœŽ โœ โœ โœŽ โœ โœŒ The Flyweight Pattern [Gamma et al., pp 195-206] โ€ข Sometimes objects too expensive for applications where large numbers of objects required โ€ข Flyweight objects provide cheaper object mechanism โ€ข Illustrates abstract factory pattern โœ–โœฃโœข โœ—โœ™โœ˜

  49. ๏ฟฝ โ˜Ž โœ” โœ• โœ– โœ– โœ— โœš โœž โœ˜ โœ› ๏ฟฝ โ˜Žโœ† โ˜ž โœž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ โœ’ โœ โ˜ž โœ„ โœ“ โ˜› โœ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โœ‚ โœž โœ‘ โœ’ โœ โœŽ โœ โœŽ โœ  โœ โœŒ โ˜ž Flyweight โ€ข In a text editor, wish to represent a set of rows, and within each row a set of columns โ€ข Each row in turn contains a set of characters โ€ข Logically, each character is a p p a r e n t an object โ€ข However, a document of tens of thousands of characters would require tens of thousands of objects โœ–โœฃโœข โœ—โœ™โœ˜

  50. ๏ฟฝ โœŽ โœ— โœ— โœ– โœ„โ˜Ž โœ† โœŸ โœ„ โ˜ž โœ โ˜Ž โœ โœ• โœ โœ โœ† โœ โ˜ž โœ† โ˜Ž โœค โ˜… โœฆโœฉ โœช โœฎ โœฌ โœช โœฏ โœฐ โœŸ โ˜Ž โœฑโœฌ โœ„ โœ† โ˜Ž โ˜ž โœŸ โœ„ โ˜ž โœ โœ„ โœ† โœŸ โœ– โœ„ โœ โœ— โœ› โœ˜ โœ  ๏ฟฝ โœ† โœŸ โ˜Ž โœ’ โœŸ โœŒ โœ โœ  โœŸโœฃ โœ โœ„ โœฎ โœฒ โœ โœ โ˜Ž โœ โœ  โœŸโ˜Ž โœŸ โœ‘ โœŸ โœŒ โœŸโœฃ โœ โœŒ โœ† โœ โœ‘ โœ‘ โœ โœŒ โœŸ โœ† โœ– โœ โœ„โ˜Ž โœ โœ„ โœš โœ โœ’ โœ† โœŸโ˜Ž โœ โœฐ โœฑ โœฉ โœฏ โœฑโœถ โœฏ โœท โœถ โœธ โœน โœฏ โœฑ โœฉ โœป โœถ โœฏ โœŽ โœ“ โœ† โœŒ โœ– โœ„โ˜Ž โœ– โ˜ž โ˜Ž โœ† โœŸ โœฃ โœฝ โ˜Ž โœ† โ˜ž โœŸ โœ โœ  โœš โœž โœ˜ โœ› โœ„ โ˜Ž โ˜Žโœ† โœž โœ„ โœ˜ โœšโœœ โœš โœŽ โœ– โœš โœ โœ’ โœ โœ โœ‚ โœ„โ˜Ž โœŸ โ˜ž โœŒ โœ โœŸ โœ โœ— โœ– โœ โœ  โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜› โœž โ˜ž โœ• โœŒ โœ โœŽ โœ โœ‘ โœŽ โœ โœ’ โœ โœ“ โ˜ž โ˜ž โœ” โœ„ โœž โœ โ˜Ž โœ’ โœ โœ• โœ† โœ โœ’ โœ โ˜Ž โœ โœ โœ– โ˜ž โœŸ โœŸ โœ— โœ— โœ โœ  โœŸ โœŽ โœš โœ โœŽ โœ โ˜ž โœ” โœ† โœ โœ โœ โœ† โœ โ˜ž โœ† โœ’ โœ โœš โœ‘ โœ˜ โœŒ โœ“ โ˜ž โœ— โœข โœ’ โœŸ โœŒ โœŸ โ˜ž โœ“ โœŒ โœ† โ˜ž โœ’ y z m t x l n w k e v i h u r g t a s f p e r p d q c p a โœ–โœฃโœข b o a n โœ—โœ™โœ˜ โœณโœตโœด Flyweight โœ†โœžโœ โœ–โœœโœ› โœ•โœ—โœ™โœ˜ โœ†โœžโœ โœ†โœžโœ โœนโœบโœถ โœ†โœžโœ โœซโœญโœฌ โœ โ˜›โœก โœ–โœœโœ› โœ–โœœโœ› โœฅโœงโœฆ โœ†โœžโœ โœ”โœญโœผ โœ•โœ—โœ™โœ˜

  51. ๏ฟฝ โœฒโœฌ โœฏ โœบ โœน โœท โœฒโœท โœฏ โœฉ โœฐ ๏ฟฝ โœฎ โœท โœช โœฌ โœฎ โœช โœฆโœฉ โ˜… โœค โœ‘ โœ’ โœบ โœฒ โœš โœบ โœฏ โœฒ โœท โœป โœฉ โœฒ โœท โœบ โœฏ โœน โœฉ โœท โœธ โœฆโœฉ โ˜… โœค โœฏ โœฒ โœท โœป โœ‘ โœณ โœ โœŸ โ˜› โœ“ โœ‘ โœ’ โœโœ‘ โœ โœŽ โœ โœŒ โ˜ž โœŸ โœ โœ” โœก โœ„ โœ  โœŸ โ˜Ž โœž โœ โœ† โœ„โ˜Ž โœ„ โœ‚ โœ โ˜› โ˜› โœ• โœš โœ– โœ– โœ˜ โœ— โœ‚ โœš โœ โœ˜ โœ โœ› โœ„โ˜Ž โœ„ โœšโœœ โœ‚ Flyweight โ€ข Intrinsic state: data that can be shared by many instances of object โœซโœญโœฌ โœดโœถโœต โœฅโœงโœฆ โœฏโœฑโœฐ โœฏโœฑโœธ โ€ข Extrinsic state: specific to a particular instance a p p a r e n t โœฅโœงโœฆ a b c d e f g h i l m k n o p q r s t u v x y z w โœ–โœฃโœข โœ—โœ™โœ˜

  52. ๏ฟฝ โ˜Žโœ† โœ– โœ โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Flyweight Implementation create (intrinsicData) โ€ข Client creates flyweight instances using flyweightFactory โ€ข Factory requires intrinsic data as parameter -- e.g., parameter is โ€œaโ€ to create instance of character โ€œaโ€ โ€ข Factory returns flyweight object with this intrinsic data โ€ข Client must maintain extrinsic data -- e.g., character font, position โœ—โœคโœฃ โœ˜โœšโœ™

  53. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ‚ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ˜ โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœ  โ˜Ž โœก โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Relation to Quality Attributes โ€ข Performance โ€“ Systems with tens/hundreds of thousands or more of objects can be prohibitively expensive in memory use โ€“ Flyweight objects reduce this expense โ€ข Modifiability โ€“ Encapsulation of system functionality no longer as clear โ€“ Separation of intrinsic/extrinsic state into different objects โœ—โœคโœฃ โœ˜โœšโœ™

  54. CISC 323 Intro to Software Engineering Lecture 6-3 Composite, Iterator, and Builder Design Patterns

  55. ๏ฟฝ โ˜Žโœ† โœ– โœ โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Composite Design Pattern [Gamma et. al. pp.163-173] โ€ข Intent โ€“ To compose object into tree structures that represent part-whole hierarchies โ€“ Lets clients treat individual objects and compositions of objects uniformly โœ—โœคโœฃ โœ˜โœšโœ™

  56. ๏ฟฝ โœ“ โœž โœ– โœ โœŒโœ‘ โœ† โœ˜ โœ“ โ˜Ž โœ  โœ โœ“ โœ โœก โœ— โ˜Ž โœŒ โ˜Ž โœ†โœ โœŒ โœŸ โ˜Ž โœ โœŸ โ˜Ž โœ‘ โœก โœ† โ˜Ž โœ“ โœŒ โœŸ โœ โœก โœ• โœ‘ โœ† โœ— โœค โœ” โœŒ โœ โœ† โœ โœ“ โœ† โœก โœ† โœ‘ โœ– โœ“ โœ  โœ† โœ— โ˜Ž โœŒ โ˜Ž โœ† โ˜Ž โœ โœ† โœŒ โœ โœ† โœ‚ โ˜Ž โœ† โœ  โœ†โœ โœ“ โœ† โœž โœ โ˜Ž โœ‘ โœ— โ˜Ž โœŒ โœŒ โœ‘ โ˜› โ˜Ž โœž โœž โœ‘ โœŒ โœ’ โœ‘ โœ โœข โœ” โœ‘ โ˜Ž โœ โ˜Ž โ˜Ž โœ“ โœ— โ˜Ž โœ† โœง โœ‘ โœ  โœŸ โœ† โœ– โœ˜ โœ‘ โœ— โ˜Ž โœฆ โœ โœŸ โœ– โœŒ โœŒ โœ“ โœ โœญ โœด โœฑ โœธ โœถ โœต โœฎ โœฑ โœฐ โœญ โœฉ โœŒ โ˜… โœ โœŸ โœ“ โ˜Ž โœž โœ โœ“ โ˜Ž โ˜Ž โœ† โœ โœŸ โœž โœ† โœ โœ† โœŒ โœ โœŸ โ˜Ž โœฅ โœ— โœ โœŒ โœ† โœ’ โœ“ โœ โœž โœŒ โœ† โœ– โœ โœŒ โœ“ โœŒโœŸ โ˜› โœž โœ† โœ— โ˜Ž โ˜Ž โœ‘ โœ— โ˜Ž โœ โœ† โœŸ โœ“ โ˜Ž โœ“ โœŒ โœŸ โœ โœก โœŸ โœž โœ“ โœ— โœ† โœŒ โœ โœŒโœ‘ โœ† โœ โœ โ˜Ž โœž โœ โ˜ž โœ’ โœ† โ˜› โœ โœก โœžโœŸ โœ†โœ โ˜Ž โœ„ โœ‚ โœ โœ† โœ โœ“ โ˜› โœŒ โ˜Ž โœ†โœ โœ โœ— โœ โœก โœŸ โœž โœ† โœ โœก โœ“ โœ“ โœŒ โœ„ โœŸ โ˜Ž โœ โœŸ โ˜Ž โ˜› โœ’ โœ’ โœ• โ˜› โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โœž โ˜Ž โœ’ โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ“ โœ” โœ› โœ„ โœž โœ  โœ› โœ›โœข โœ™ โœ„ โœž โ˜Žโœ† โ˜Ž โœœ โ˜ž โœ™ โœž โœ› โœ˜ โœ— โœ— โœ– โœ• โ˜ž โœ” โœŸ โœŸ โœ‘ โœ† โœš โœ’ โœŸ โœ โœ† โœ โœ“ โ˜Ž โ˜Ž โœ โœŸ โœž โœ– โœ โœ– โœŒ โ˜Ž โœž โœŒ โœ† โœ“ โ˜Ž โœ„ โœŸ โ˜Ž โœŒ โœŸ โœ  โœ„ โœ†โœ โœ– โœ˜ โœ† โ˜Ž โœ†โœ โœ โœ† โœ„ โœ„ โœ“ โœž โœ‘ โœš โœ† โœ’ โœ โœ โ˜Ž โœž โœ โœŒ โœ† โœŒ โœ— โœ  โ˜Ž โœŒ โœ† โœŒ โœ โ˜Ž โœ‘ โœ— โ˜Ž โœ† โœŒ โœ† โœ โ˜Ž โœ  โœ โœก โœ“ โ˜Ž โœ“ โœ‘ โœ† โœŒ โœ† โœŸ โœ“โœ™โœ˜ โœ“โœ™โœ˜ Solution: Use the composite design pattern โ˜ŽโœŽโœ โœ’โœฃโœŸ โœ—โœคโœฃ โ˜›โœœโœ› โœถโœบโœน โœฎโœŽโœท โ˜›โœœโœ› โ˜ŽโœŽโœ โœ˜โœšโœ™ Motivation โœชโœ™โœท โ˜ŽโœŽโœ โœฎโœŽโœด โœฒโœฌโœณ โœฎโœŽโœฏ Problem: โ˜ŽโœŽโœ โœชโœฌโœซ โ˜ŽโœŽโœ โ€ข โ€ข

  57. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ” โœ  โœก โ˜Ž โœ† โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Applicability โ€ข Use the Composite pattern ifโ€ฆ โ€“ You want to represent part-whole hierarchies of objects. โ€“ You want clients to be able to ignore the difference between compositions of objects and individual objects. Clients will treat all objects in the composite structure uniformly. โœ—โœคโœฃ โœ˜โœšโœ™

  58. ๏ฟฝ โœœ โœ– โœ– โœ˜ โœโœฉ โ˜… โœง โœฃ โœฃ โœข โœš โœœ โœ– โœข โœ” โœข โœœ โœ› โœ™โœš โœ˜ โœ“ โœ— โœ– โœ” โœ’ โœ โœ’โœ“ โœ โœ โ˜… โœŒ โ˜… โœฎ โ˜… โœฑ โœ โœš โœข โœ› โœโœฐ โ˜… โœ’โœ• โœข โœฅ โœโœฏ โœฎ โœโœช โ˜… โœญ โœ โœ™ โœฌ โœœ โœŽ โœ โ˜… โœš โœ• โœ™ โœข โœž โœ”โœ• โœ– โœ’ โœ™ โœž โœ› โœŸ โœ˜ โœ— โœ— โœก โœ• โ˜ž โ˜ž โœ” โœ“ โœ„ โœ† โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โœก โ˜Ž โœ  โœœ โœž โ˜› โœž โœ  โœ‚ โœ„ โœ† โœ โœ’ โœ“ โœ’ โœ โœ› โœ„ โ˜Ž โ˜Ž โ˜Žโœ† โœž โœ„ โœ™ โœž โœ›โœข โ˜Žโœ† โœ› โœ  Example: Swing Components โ€ข Component โœŽโœ‘โœ โœ‚โ˜Žโœ„ โ˜›โ˜Žโ˜ž โœโœŸโœž โœ™โœคโœฃ โœ–โœฆโœฅ โ€ข Leaf (atomic components) Given a frame containing multiple panes, each with multiple buttons/labels/checkboxesโ€ฆ โœซโœคโœ• - Call paint() method on frame causes everything to be painted. โ€ข Composite (top-level Swing - Changing the look and feel on the containers) frame is likewise propagated down. โœ—โœคโœฃ โœ˜โœšโœ™

  59. ๏ฟฝโœ โœ› โœ’โœ“ โœ โœ”โœ• โœ” โœ– โœฃ โœซ โœข โœง โœ› โœ” โœฑ โœœ โœซ โœš โœฅ โœฅ โœš โœ› โœซ โœœ โœฃ โœ• โœ โœฉ โœ– โœช โ˜… โœ” โœ• โœฅ โœœโœ โœ โœœโœ โœ โœฅ โœฉ โœš โœ› โœซ โœœ โœ” โœ” โœฃ โœข โ˜… โ˜… โœ‚ โœ โœ• โ˜… โœฅ โœซ โœฅ โœ˜ โœ โœ› โœง โœข โœ• โœฐ โœ™ โœฃ โœ”โœ• โœ› โœฅ โœ• โœฉ โœ’โœ“ โœ– โœ– โœ• โœœ โœข โœฅ โœฅ โœ• โœ” โœฎ โœ› โœ– โœ” โœ”โœ• โœ โœ’โœ“ โ˜… โœข โœ” โœฃ โœ– โœœ โœ• โœฆ โœ™ โœ โœ• โœ” โœ– โœข โœš โœ˜ โœ“ โœ› โœ– โœ› โœ โœš โœœ โœฃ โœ– โœ” โœ’โœ• โœ• โœ’โœ“ โœ› โœซ โ˜… โœฃ โœ– โœ” โœ”โœ• โœซ โœฅ โœฃ โœ• โœ” โœ โœ› โœ– โœข โœฅ โœ“ โœ• โœ โœฉ โœ• โœ– โœข โœš โœ› โœ” โœ› โœฐ โ˜Ž โ˜Žโœ† โœž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โ˜… โœ• โœœ โœœ โœš โœข โœฅ โœ• โœฃ โœ– โœ› โœ” โœ– โœ• โœฃ โœฅ โœข โœ„ โœ™ โœ• โœŒ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜› โœž โœ  โ˜ž โœ โœž โ˜ž โœ› โœ˜ โœ— โœ— โœ– โœ• โ˜ž โœŽ โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœ โœœ โœฅ โœฅ โœ˜ โœฅ โœ“ โœฅ โœ โœฅ โœฅ โœ โœ’ โœ› โœง โœข โœซ โœ โœ™ โœ› โœ› โœ”โœ• โœ– โœ โœ’โœ“ โœœโœ โœ” โœ› โœฃ โœœ โœ– โœ• โœฆ โœ™ โœ โœ• โœง โœ› โœฃ โœ• โœ› โœœ โœ’โœ“ โœœโœ โœ” โœ› โœฃ โœ– โœ• โœฃ โœฆ โœ™ โœ โœš โœš โœข โœฅ โœฅ โœ โœ› โœ– โœ• โœฐ โ˜… โœ โœ› โœ” โœฃ โœŽโœ‘โœ โœซโœคโœ• โœ—โœคโœฃ Participants โœ˜โœšโœ™ โœš โœฉโœญโœฌ โœซโœคโœ• Component Composite Client Leaf โ€ข โ€ข โ€ข โ€ข

  60. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœ‚ โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœž โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœ” โœŸ โœ† โœ  โœก โ˜Ž โœž โœž โœ โœ  โœ’ โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Structure Component 0..* 0..* Client operation() addComponent() removeComponent() getChild() Composite Leaf +children operation() addComponent() operation() removeComponent() getChild() โœ—โœคโœฃ โœ˜โœšโœ™

  61. ๏ฟฝ โœŽโœ โœ โœ“ โœ โ˜ž โœ’ โœ„ โœŸ โœ‘ โœŽ โœŽ โœ„ โœ†โœ โœ• โœŒ โ˜ž โ˜› โœ„ โœก โœ  โœ„ โœŸ โœž โœ โœ† โœ—โœ˜ โ˜› ๏ฟฝ โœŽ โœ„ โœŸ โœŽ โœ โœ‘ โœŒ โœ’ โœ• โ˜ž โœŽ โœ„ โœŸ โœ‘ โœ† โœŸโœš โœ• โœ โ˜ž โ˜› โœ„ โœก โœ  โœ„ โœŸ โœž โœ โœ โœ– โœ โœ— โœ• โ˜ž โœ โ˜ž โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœŽ โœ— โœ โœŒ โ˜ž โœ  โœž โ˜› โ˜Ž โœก โœ  โœ† โ˜Žโœ† โœ˜ โœž โ˜Ž โœ‚ โœ’ โœ“ โœ’ โœ› โœž โœ  โœ› โœ„ โœ›โœข โœ™ โœ„ โœž โ˜Žโœ† โ˜Ž โœ„ โœœ โœ™ โœž โœ› โœŸ Collaborations โ€ข Collaborations โ€“ Client uses component class interface to interact with objects in composite structure. โ€“ If recipient is: โœ‚โ˜Žโœ„ โ˜žโœ™โœ„ โœ”โœ–โœ• โœ—โœคโœฃ โœ˜โœšโœ™

  62. ๏ฟฝ โ— โ† โ— โ‰ โ โ† โ–  โ† โ‰ โ–ผ โ… โ‡ โ— โ โ—† โˆ โ— โˆ โ–ฒ โญ โ–  โ–ผ โ† โ–  โ— โ โ‰ โ โ…โ† โ… โ–ผ โ… โœฎ โœต โด โœฒ โœฏ โช โจ โœท โณ โซ โœด โจ โช โช โœฒ โœฌ โœฑ โœณ โœด โœท โœฏ โœฎ โœด โœฑ โœท โœฏ โœด โณ โœฎ โฒ โ—† โ‹ โœปโœผ โ„ โฏ โ โŠ โ‰ โˆ โ… โ โ† โ— โ–  โ โฏ โ–  โฏ โ โ–  โ† โ– โ–  โ โ–ผ โ โ… โ… โ† โ† โ–  โ โ— โ„ โ–ฒ โ… โ—† โ— โ–ผ โฑ โ–  โ— โˆ โ‰ โ‡ โญ โ–  โ โ‰ โ โ–  โ–ผ โ† โ— โ… โŠ โ‰ โญ โˆ โ… โ โ† โ— โ… โ† โœฒ โœฒ โ— โœด โœณ โœด โœต โœฐ โœบ โจ โœฒ โœด โœธ โœฎ โฃ โœฒ โœฑ โœฑ โœฎ โœท โœฏ โœฒ โœปโœผ โœฒ โœต โœฎ โœฑ โจ โœฎ โซ โœถ โœฒ โœฑ โœท โด โœฑ โณ โœดโœต โฃ โœต โœด โœป โœท โœฑ โœถ โœณ โœฒ โช โœฒ โœด โจ โœธ โœฎ โฃ โœถ โœฒ โœฐ โœฏ โœฑ โœดโจ โจ โœฒ โœปโœผ โœฒ โœต โœฐ โค โจ โฒ โœฑ โœณ โœด โช โœณ โœฎ โฃ โœฑ โœท โœฏ โœด โณ โœฎ โœฌ โœฑ โœซ โœฅ โข โœ โœช โœง โœ โœซโœ โœฉ โ› โต โœฏ โœฑ โœดโจ โœฒ โœฒ โ€ โœดโจ โœด โœฑ โœท โœฏ โœฒ โœปโœผ โœฒ โœต โœฎ โด โœฒ โœฏ โœฑ โจ โœณ โœฒ โœปโœผ โœฒ โœต โœด โฃ โœฑ โœฑ โœต โœท โœณ โœฑ โœฏ โœด ๏ฟฝ โ…โ† โ‹ โœด โˆ โ… โ‡ โ… โƒ โ‚ โœฑ โœดโœต โœฟ โœพ โœฒ โœฝ โœบ โ‹ โœปโœผ โœฒ โœต โœด โœฏ โœฒ โœปโœผ โœฒ โœต โœฐ โœบ โœด โœฏ โ‰โŠ โ— โœถ โ—† โ–ผ โ‹ โ‰ โŠ โ‰ โŠ โ โ— โ… โ‡ โ— โ โ— โ— โ…โ† โˆ โ–ฒ โ‰ โ–ผ โ โŠ โ… โ–ฒ โ‘ โ… โ–  โŠ โ โœณ โœดโœต โ โ˜› โœ• โœ” โ˜› โ˜› โœ“ โœ‘ โœ’ โœโœ‘ โœ โœŽ โœ โœŒ โ˜ž โœŸ โœ– โœ โœก โœ„ โœ  โœŸ โ˜Ž โœž โœ โœ† โœ„โ˜Ž โœ„ โœ‚ โœ โœ– โœ— โœณ โœ‘ โœฒ โœฑ โœฐ โœฏ โœฌ โœซ โœช โ˜…โœฉ โœฅ โœง โœ โœ‘ โœ’ โœš โœš โœ โœŸ โœš โœšโœœ โœ˜ โœ‚ โœ โœ„โ˜Ž โœ„ โœ‚ โœ› โœ˜ โœ โ–  โ† โ‰ โ† โ–ฒ โ—† โ–  โŠ โ… P โ† โ‰ โŠ โ† โˆ โฑ โ โ— โ–ผ โ„ โŠ โ— โ„ โฏ โ โŠ โ… โ—— P โ–  โ– โ… โ–  โ… โ–ฒ โœต โฉ โ‚ โœณ โœด โœบ โœผ โœป โœท โœฏ โœฑ โœดโจ โœท โœบ โœฏ โ โœด โณ โœฎ โฒ โœฌ โ† โ–  โ–  โ–ผ โ โ† โ‰ โ™ โ‹ โ‘ โ… โ— โ โŠ โ—† โ—— P โ–  โ… โ‡ โ— โ โ— โ—† โˆ โ–  โ˜ โ‚ โ โŠ โ… โ—— โ—† P โ–  โ… โ โ— โ–ผ โ–ผ โŠ โ–ฒ โ–ผ โ–  โŠ โ… โˆ โ–  โ—† โ–  โ โ… โ† โ— โ โ… โ‰โŠ โ‰ โ–  โ–  โ† P โ… โŠ โ–  โ—† โ–ฒ โ–ผโšโ™ โโœฆโŠ โœฏโโ€ โœ–โœฃโœข Consequences โœ—โœ™โœ˜ โโœฆโ… โœฏโโ€ โ‹โœนโฌ โœทโœนโœธ โ„โœฆโ…โ† โ„โœฆโ… โจโœฃโœ โโกโž โœญโœฆโœฎ โœคโœฆโœฅ

  63. ๏ฟฝ โœฏ โœฝ โœพ โœฌ โœง โœป โœช โœง โœถ โœผ โœญ โœฌ โœง โœท โœฑ โœฑ โœฑ โœณ โœง โœน โœง โœผ โœผ โœฐ โœฒ โœท โœฝ โœซ โœช โœง โœง โœง โœถ โœฌ โœฒ โœถ โœญ โœบ โœบ โœฉ โœฐ โœบ โƒ โœฑ โœถ โœฐ โœฌ โœญ โœฎโœฏ โœญ โœฉ โœง โœบ โœฑ โœท โœฝ โœญ โœฌ โœฒ โœฑ โœป โœฐ โœฌ โœฐ โœฑ โœช โœบ โ‚ โœฅ โœฒ โœถ โœญ โœบ โœฑ โœฌ โœฑ โœฑ โœฉ โœง โœต โœฝ โœญ โœง โœบ โœฑ โœฌ โœช โœง โœพ โœบ โœณ โœฉ โœง โœฎ โœง โœถ โœฎโœฏ โœฐ โœฑ โœญ โœณ โœฌ โœฐ โœง โœช โœง โœผ โœน โœง โœฑ โœณ โœฐ โœฑ โœณ โœง โœณ โœญ โœฎโœฏ โœฉโœญ โœช โœง โœช โœช โœฐ โœฌ โœช โœง โœฒ โœณ โœช โœพ โœช โœง โ„ โœณ โœบ โœซ โœฉ โœน โœง โœฑ โœณ โœฐ โœฌ โœง โœป โœช โœง โœถ โœฝ โœฐ โœญ โœง โœท โœถ โœง โœป โœฐ โœฌ โœน โœซ โœฉ โœง โœน โœฌ โœน โœถ โœซ โœฑ โœฉ โœซ โœน โœฑ โœฌ โ… โœง โœถ โœฎโœฏ โœฉโœญ โœฒ โœผ โœณ โœฌ โœฐ โœน โœฏ โœง โœบ โœฑ โœฌโœง โœซ โœณ โœฉโœช โœฑ โœณ โœง โœถ โœฎ โœฉ โœง โœบ โœฑ โœน โœญ โœผ โœง โœน โœง โœบ โ‚ โ โœฐ โœฐ โœญ โœฎโœฏ โœฐ โœฑ โœฉ โœง โœถ โœถ โœฉโœญ โœง โœฑ โœฐ โœฌ โœญ โœฉโœญ โœฑ โœง โœบ โœฑ โœฒ โœณ โœช โœผ โœช โœง โœถ โœง โœป โœฐ โœ โœฉ โœผ โœญ โœฉ โœญ โœฑ โœฎ โœฌ โœฐ โœบ โœฏ โœน โœญ โœฎ โœฏ โœง โœฌโœง โœซ โœฑ โœฌ โœซ โœต โœฑ โœด โœฌโœณ โœง โœญ โœฒ โœน โœช โœฑ โœญ โœฎ โœญ โœน โœน โœฌ โœฑ โœฉ โœง โœต โœฝ โœญ โœผ โœฌ โœฑ โœง โœฏ โœท โœฑ โœฌ โœซ โœญ โœฐ โœน โœช โœป โœง โœง โœฐ โœบ โœ  โ˜ž โ˜ž โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœž โœ– โ˜› โ˜Ž โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ โœ• โœ— โœฌ โœ  โœญ โœฎโœฏ โœฉโœญ โœฌโœง โœซ โœฉโœช โœฅ โœ’ โœ“ โœ’ โœ› โœž โœ› โœ— โœ›โœข โœ™ โœ„ โœž โ˜Žโœ† โ˜Ž โœ„ โœœ โœ™ โœž โœ› โœ˜ โœฑ โœผ โœง โœญ โœบ โœฑ โœผ โœญ โœณ โœญ โœฐ โœฑ โœฉ โœง โœถ โœถ โœฉ โœฌโœง โœช โœฌ โœฒ โœถ โœญ โœบ โœบ โœฑ โœญ โœช โœฑ โœช โœง โœญ โœฑ โœฌโœง โœง โœฑ โœณ โœฐ โœง โœฎ โœช โœฌ โœง โœบ โœฑ โœฌ โœซ โœฝ โœญ โœฌ โœถ โœช โœฒ โœณ โœช โœฌ โœฑ โœฉ โœง โœต โœบ โœฝ โœฌ โœฐ โœฌ โœฌ โœฐ โœน โœฉ โœฌ โœง โœฒ โœญ โœฌ โœถ โœช โœฑ โœฉ โœง โœช โœผ โœน โœง โœฑ โœณ โœฐ โœณ โœญ โœฎ โœฎ โœญ โœฉ โœบ โœฑ โœฉ โœผ โœช โœถ โœฉ โœน โœง โœณ โœฐ โœช โœฑ โœณ โœน โœช โœฉโœญ โ โœญ โœง โœณ โœช โœญ โœฑ โœฐ Why is Composite considered a design pattern and โœฝโœถโœธโœท not just an example of polymorphism? โœฌโœฟโ โœถโœธโœท โœ—โœคโœฃ โœฝโ€โœง โœงโœฟโœพ โœ˜โœšโœ™ Question? โœงโœฟโœพ โœถโœธโœท โœฆโ˜…โœง โ€ข

  64. ๏ฟฝ โœญ โœถ โœง โœฎ โœง โœณ โœฑ โœฌ โœผ โœถ โœฑ โœบ โœง โœฌ โœฑ โœน โœซ โœง โœถ โœฑ โœช โœผ โœญ ๏ฟฝ โœฐ โœฑ โœง โœน โœฑ โœช โœฐ โœณ โ„ โœญ โœป โœง โœน โœฉ โœซ โœน โœญ โœฉโœญ โœณ โœฑ โœง โœณ โœฑ โœฌ โœผ โœง โœช โœป โœง โœฉ โœฑ โœญ โœน โœ† โœน โœป โœน โœถ โœง โœ โœน โœง โ… โœช โœฎโœฏ โœฐ โœญ โœฑ โœง โœน โœช โœฑ โœฐ โœณ โ„ โœฑ โœน โœญ โœ– โœŽโœ’ โœ“ โœ’ โœ” โ˜ž โ˜ž โœ• โœ— โœ โœ— โœ˜ โœ› โœž โœฏ โœœ โœ„ โœ‘ โœŽ โ˜Žโœ† โœ† โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ  โœ โœก โ˜Ž โ˜› โœž โœ  โ˜ž โœŒ โ˜Ž โœ™ โœž โœน โœน โœซ โœ„ โœฑ โœซ โœน โœง โœฌ โœง โœฌ โœ„ โœซ โœฐ โœน โœง โœฌ โœซ โœฏ โœฑ โœฉ โœท โœ’ โœ™ โœ›โœข โœณ โœ  โœž โœ› โœ› โœช โœ“ โœ’ โœ โœ‚ element in list Move to next Current element The Iterator Pattern โœ—โœคโœฃ Last element for (int i=0; i < v.size(); i++) { [Gamma et al, pp 257-271] Object o = v.elementAt(i); โœ˜โœšโœ™ โœงโœฟโœพ โ€ฆ โ€ฆ } First element โ˜Ž โ˜…โœญ

  65. โœ ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ‚ โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž The Iterator Pattern โ€ข Iteration allows a program to successively visit each element in a container class โ€“ I.e. over any class that contains a collection of elements โ€ข List (Vector), Tree, Hash Table, Graph, โ€ฆ โœ—โœคโœฃ โœ˜โœšโœ™

  66. ๏ฟฝ โœท โœบ โœฉ โœท โœฉ โœซ โœฉ โœง โœฎ โœฟ โœฏ โœท โœญ โœป โœฉ โœฌ โœฉ โœฎ โœช โœฌ โœง โœฉ โœณ โœถ โœพ โœธ โœผ โœฉ โœ โœง โœณ โœฉ โœฌ โœท โœธ โœฏ โœง โœถ โœฝ โœฐ โœง โœฎ โœญ โœฏ โœง โœฉ โœฌ โœฑ โœฉ โœป โ€โ โœฎ โœง โœต โœฒ โœฏ โœด โœฏ โœฎ โœญ โœฎ โœฏ โœฐ โœง โœฌ โœฐ โœฎ โœด โœฑ โœฉ โœถ โœฏ โœต โœฏ โœฉ โœฐ โœฉ โ‚ โœญ โƒ โ„ โ… โ โ† โ โ€ โƒ โœฉ โ‡ โœถ โœณ โœฎ โœท โœธ โœฐ โœง โœถ โœฉ โœฝ โˆ โœฌ โœบ โœช โœด โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœฅ โœ• โ˜ž โœง โ˜Ž โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜› โœ” โœž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ“ โœ’ โœฎ โœฉ โœช โœฎ โœต โœช โœง โœถ โœฎ โœง โœญ โœท โœฏ โœบ โœซ โœญ โœฎ โœญ โœป โœด โœฎ โœฌ โœญ โœถ โœง โœณ โœณ โœฌ โœฑ โœฒ โœฏ โœง โœฉโœด โœฏ โœฎ โœฉ โœฎ โœฌ โœญ โœญ โœฎ โœฌ โœฉ โœฐ // Returns true as long as there are more // Returns next element to visit โœฎโœนโœธ public interface Enumeration { โœฏโ˜…โœฐ boolean hasMoreElements(); Iterators in Java โœ—โœคโœฃ Object nextElement(); โœฏโ˜…โœฐ // elements to visit โœ˜โœšโœ™ โœฎโœนโœธ โœฏโ˜…โœฐ โœฆโ˜…โœง }

  67. ๏ฟฝโœ โœ’ โœ˜ โœ› โœ„ โœ‚ โ˜Žโœ† โœž โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ โœš โœ’ โœฝ โœค โœฅ โœฉ โœญโœฎ โœฏ โœด โœต โœช โœณ โœถโœท โœง โœฎ โœž โ˜Ž โœž โœŒ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜› โœ— โ˜ž โœ  โœ โ˜ž โœ“ โœ” โœ• โœ’ โœŽ โœ โ˜ž โœ– โœŽโœ’ โœ‘ โœ– โœ Iterators in Java โœชโœฌโœซ โœฆโ˜…โœง // Returns all elements in the Vector public Enumeration elements(); โœฐโ˜…โœฑ โœฒโ˜…โœณ // Returns all elements in the Hashtable. // That is, returns all values that have been // entered into the hashtable via put public Enumeration elements(); โœ–โœฃโœข โœ—โœ™โœ˜

  68. ๏ฟฝโœ โ˜Žโœ† โœ• โœ– โœ– โœ— โœš โœž โœ˜ โœ› โœ„ โ˜Ž โœž โœ‚ โœ„ โœ˜ โœšโœœ โœš โœ  โœž โœš โœ โœ’ โœ โœ” โ˜ž โ˜ž โœ“ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โ˜› โœž โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽ โœ โœ’ โœ Example: Using an Iterator with โœ–โœฃโœข โœ—โœ™โœ˜ a Vector

  69. ๏ฟฝ โœš โœ โœ’ โœ โœš โœž โœ  ๏ฟฝ โœ† โœ˜ โœ„ โœž โ˜Žโœ† โ˜Ž โœ„ โœ โœ  โœ˜ โœก โœ”โœ— โœ• โ˜ž โœกโ˜› โœ– โœ” โœ” โœกโ˜› โœ‘ โ˜ž โœŽ โœกโœ“ โœŽ โœ โœ› โœšโœœ โœž โœ  โœš โ˜ž โœ  โœž โ˜› โ˜Ž โœก โœ† โœŽ โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ โœ โœŒ โ˜ž โ˜ž โœ— โœ– โœ– โœ โœ‘ โœ• โœŽ โœ โœ” โœ’ โœ โœ“ Using an Iterator with a Vector โ€ข Client creates an iterator by calling the Vectorโ€™s elements method โ˜žโœŸโœ• โœโœ’โœ‘ โœโœŸโœž โ˜žโœŸโœŒ โœ‚โ˜Žโœ„ โ€ข Client then accesses elements of Vector via Enumerationโ€™s methods for (Enumeration e = v.elements(); e.hasMoreElements();) { Object o = e.nextElement(); โ€ฆ } โœ–โœฃโœข โœ—โœ™โœ˜

  70. ๏ฟฝ โ˜Žโœ† โœ– โœ โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Implementation of Iterator for Vector โ€ข Vector must implement method โ€“ Enumeration elements () โ€“ Must return an implementation of the Enumeration interface โ€“ Iterator must successively return values in vector โœ—โœคโœฃ โœ˜โœšโœ™

  71. ๏ฟฝโœ โ˜Žโœ† โœ– โœ— โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โœ‚ โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โ˜ž โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœก โ˜Ž โœž โœ” โœ  โ˜ž โœŒ โœ โœŽ โœ โœ‘ โœŽโœ’ โœ“ โœ’ Classes for Vector Iterator โœ—โœคโœฃ โœ˜โœšโœ™

  72. class Vector { โ€ฆ public Enumeration elements () { return new VectorEnumeration (this); } โ€ฆ } How we might implement an enumeration in a vector. (Not necessarily how it is really implemented.)

  73. import java.util.Vector; class VectorEnumeration { // Represents where we are in the vector private int currentElement = 0; // The vector we are iterating through private Vector v; public boolean hasMoreElements () { return (currentElement < v.size()); } public Object nextElement () { Object returnElement = v.get (currentElement); currentElement++; return returnElement; } public VectorEnumeration (Vector v) { this.v = v; } }

  74. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ‚ โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž General Form of Iterator Abstract representation of container Enumeration interface Concrete representation Concrete iterator for specific container class - e.g. of container - e.g. Vector iterator for Vector is different from iterator for hashtable โœ—โœคโœฃ โœ˜โœšโœ™

  75. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— ๏ฟฝ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ˜ โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ” โœ† โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Relation to Quality Attributes โ€ข Modifiability โ€“ Separates iteration behaviour from specifics of container class โ€“ Therefore can change container class without impacting code that iterates over it โ€ข Performance โ€“ May be some minor performance penalty through indirection in iterator โœ—โœคโœฃ โœ˜โœšโœ™

  76. ๏ฟฝ โ˜Žโœ† ๏ฟฝ โœ— โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ– โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ  โœ” โ˜Ž โœก โœž โœ โœ’ โœ“ โœŽโœ’ โœ  โœ‘ โœŽ โœ โœŒ โ˜ž Builder Design Pattern [Gamma et. al. pp. 97-106] โ€ข Intent โ€“ Separate the construction of a complex object from its representation โœ—โœคโœฃ โœ˜โœšโœ™

  77. ๏ฟฝ โ˜Žโœ† โœ– โœ“ โœ— โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Applicability โ€ข Use the Builder pattern whenโ€ฆ โ€“ The algorithm for creating a complex object should be independent of the parts that make up the object and how theyโ€™re assembled โ€“ The construction process must allow different representations for the object thatโ€™s constructed โœ—โœคโœฃ โœ˜โœšโœ™

  78. ๏ฟฝ โœŒโœ โœŽ โœœ โœฎ โœŒ โœฌ โœ• โœš โœ‘ โœœ โœ• โœฃ โœ› โœ” โœ™ โœ’โœ“ โœ‘ โœ• โœ โœœ โœ‘ โœ“ โœ™ โœฉ โœซ โœŒ โœŸ โ˜… โœฌ โœ• โœ‘ โœ• โœ“ โœŒ โœŒโœ‘ โœ– โœŒโ˜› โœต โœ  โœง โœ– โœ‚ โœ โœฅ ๏ฟฝ โœŒ โœ โœ’ โœ โœ– โœŒ โœ• โœ  โœฅ โœ โœฑ โœŒ โœ• โœ’โœ“ โœ‘ โœŒ โœ› โœŽ โœฒ โœ™ โœ– โœ  โœ โœŒโœ‘ โœ• โœ’ โœ’ โœ– โœ โœ• โœŽ โœ“ โœ™ โœŽ โœ– โœ’ โ˜… โœŒ โœง โœž โœŸ โ˜Ž โœณ ๏ฟฝ โœ• โœ โœ™ โœ– โ˜› โœฌ โœ โœ• โœš โœฒ โœŒ โœŽ โœ– โœ• โœŒ โœ– โœ– โœŒ โœŒ โœ™ โœ’ โœš โœ’ โœ– โœ‘ โœŒ โœ โœ’ โœ โœ– โœŒ โœ• โœ› โœ‘ โœœ โœซ โœ โœ• โœ– โœ’ โ˜› โœ• โœ“ โœŒ โœœ โœ‘ โœŒ โœŽ โœ™ โœซ โœœ โœ‘ โœŒ โœ– โœซ โœ’ โœ โœŒ โœฌ โœ• โœ• โœช โœ‘ โœ• โœ– โœ’ โ˜› โœŒ โœฌ โœ• โœš โœซ โœ” โœ• โœ• โœช โœŒ โœ  โœŽ โœ• โœ โœœ โœ‘ โœ“ โœ™ โœ โœ– โœ› โœ“ โœ“ โœœ โœ• โœŒโœ โœฃ โœ” โœ™ โœถ โœŒ โœซ โ˜› โœน โœ โœ‘ โœ’ โœ“ โœ™ โœ โœŒ โœฌ โœ• โœŒ โœ โœŒ โœ› โœ• โœฌ โœซ โœ• โœŒโœ‘ โœ‘ โœ‘ โœ’ โœซ โœ โœ‘ โœŒ โœ› โœœ โœ• โœŒ โœ• โœ• โœ– โœ โœ– โœŒ โœ โœ’ โœ โœ– โœŒ โœ• โœ โœ’ โœ’ โœ‘ โœ” โœ’ โœ’โœ“ โœŒโœ‘ โœŽ โœ โœŽ โœŒโœ โœ  โœŒ โœ• โœž โœ• โ˜… โœž โœŸ โœฆโœง ๏ฟฝ โœ• โœŒโœ โœ“ โœ” โœ™ โœ โœš โœ™ โœ– โ˜› โœ’ โœ โœ™ โœ‘ โœ• โœ– โœ’ โ˜› โœŸ โœ†โœ โ˜Ž โœž โœ’ โœ“ โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โ˜ž โœ  โ˜› โ˜ž โ˜Ž โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ โœ” โ˜ž โ˜Ž โœ„ ๏ฟฝ โœ’ โœ“ โœ’ โœ› โœž โœ  โœ› โœ›โœข โœ™ โœž โœ• โ˜Žโœ† โ˜Ž โœ„ โœœ โœ™ โœž โœ› โœ˜ โœ— โœ— โœ– โœž โœฃ โœ†โœ โœŽ โœ โœ’ โœ โœ– โœŒ โœ• โœ– โœŒ โœ› โœซ โœœ โœ  โœฎ โœŒ โœฌ โœ• โœš โœŽ โœ• โœ“ โœŒ โœช โœŒ โœŒ โœฏ โ˜› โœ™ โœŒ โœŒโœ‘ โœ– โ˜› โœŒ โœ– โœŒ โœฌ โœ• โœ โœฐ โœŒ โœ โœ’ โœ‘ โœŒโ˜› โœŒ โœฐ โœ› โœ’โœ“ โœ‘ โœŒ โœ โœซ โœ“ โœช โœ› โœ’ โœŽ โ˜› โœ‘ โœŒ โœ”โœซ โœช โœŒ โœ‘ โœ‘ โœ’ โœ’โœ“ โœ• โœ‘ โœ• โœ โœœ โœ‘ โœ“ โœ™ โœฉ โœ  โœŸ โœž โœ– โœ• โ˜› โœ โœ• โœ โœ‘ โœ™ โœ™ โœ– โœŒ โœฌ โœ• โœ›โœขโœœ โœŽโœ˜โœ“ โœŽโœ˜โœ“ โœ”โœขโœญ โœ™โœ“โœธโœท โœ‘โœธโœบ โœŽโœ˜โœ“ โœ›โœขโœœ โœ›โœขโœœ โœ•โœ—โœ– โœŽโœ˜โœ“ โœŽโœ˜โœ“ โœ—โœคโœฃ โœŽโœ˜โœ“ โœŽโœ˜โœ“ โœโœ„โœ™ Participants โœ˜โœšโœ™ โœŽโœ˜โœ“ โœŽโœ˜โœ“ โœโœ„โœ™ โœŽโœ˜โœ“ โœŽโœ˜โœ“ โœ•โœ—โœ– โœ•โœ—โœ– โœŽโœ˜โœ“ โœโœ„โœ™ โœโœ„โœ‚ โœŽโœ˜โœ“ โœ•โœ—โœ– โœ•โœ—โœ– โœŽโœ˜โœ“ โœกโ˜žโ˜› โœŽโœ˜โœ“ โœโœ„โœ‚ โœคโœ„โœฅ โœดโœ„โœŸ

  79. ๏ฟฝ โœฌ โœฎ โœฟ โœพโ˜… โœฝ โœญ โœฏ โœช โœฎ โ€ โœฏ โœพ โœถ โœถโ… โœฌ โœซ โœช โ‚ โœถ โœญ โœซ โœง โœป โœถ โœฌ โ… โœถ โœธ โœฏ โœถ โœง โœธ โฏ โ– โ™ โ™ โฑ โ˜ โšโฏ โ™ โ—— โ–ผ โ–ฒ โ‘ โ† โœถโ… โœธ โœฎ โœธ โœฎ โœซ โ‚ โ‚ โœถ โ€ โœฏ โœฟโ… โœซ โœฌ โœฎ โœถ โœญ โ˜ โœฌ โœถ โ˜… โœฌ โœญ โœฏ โœฎ โœฌ โœซ โœฝ โ โ˜… โœฎ โ˜… โœญ โ˜… โœฟ โœญโœฏ โœฎ โœฟ โ˜… โœฌ โœ โ€ โ€ โœซ โœช โœถ โœป โœฎ โœถ โœฝ โœป โœธ โŠ โœฟ โœฏ โœซ โœฎ โœถ โœฎ โœฟ โ˜… โœธ โ˜… โœฌ โ˜… โœฎ โœฌ โœฎ โœฟ โ˜… โœฌ โ˜… โ€ โ€ โœซ โœช โœถ โœฎ โœฏ โฉ โฌ โœฝ โ™ โฃ โ โฑ โ—† โž โ—† โฑ โ˜ โ โฌ โญ โ– โ—† โ—† โญ โฌ โ™ โ—— โฏ โฌ โ˜ โซ โ™ โญ โฑ โ– โฏ โญ โช โฌ โ™ โฑ โ—† โฌ โ™ โ– โ˜ โฌ โญ โก โฏ โ โ˜ โš โ—† โ˜ โฏ โก โฏ โฏ โฌ โ™ โ˜ โฅ โฏ โœ โฉ โš โ˜ โค โต โด โ˜ โ˜ โ™ โ˜ โ™ โฑ โฏ โ– โฏ โฌ โฉ โฏ โฌ โต โฑ โฑ โต โญ โ—† โ™ โซ โด โฌ โ™ โ– โฑ โญ โญ โฑ โ™ โ–ฒ โ—† โฒ โโ˜ โซ โด โต โญ โฌ โฉ โ™ โช โญ โฑ โ™ โ˜ โฑ โฌ โฌ โญ โ™ โ– โฑโฏ โ—† โช โฏ โต โฌ โญ โ™ โซ โฏ โœป โ˜… โœธ โœป โœช โœด โœณ โœฒ โ˜… โœง โœฎ โœธ โ˜… โœธ โœฌ โœถ โœฎ โœญ โœซ โœผ โœฌ โ˜… โœธ โœฌ โœถ โœป โœฎ โœบ โ˜… โœฎ โœถ โœฏ โœฝ โœฌ โœฎ โœฎ โœฟ โ˜… โœฎ โœฟ โœฏ โƒ โœช โœฌ โœซ โœฝ โ โœธ โœซ โœพโ˜… โœธ โ˜… โœซ โ€ โœซ โœฎ โœฏ โœฟ โœช โœฟ โœถ โœฎ โœฟ โœท โœถ โœถ โ˜ž โœ• โ˜ž โ˜ž โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โœ  โœ— โœž โ˜› โ˜Ž โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ โœ– โœ— โ˜… โœ› โœต โœณโœด โœฒ โœฑ โœฌ โœญ โ˜… โœช โœฆ โœฅ โœ’ โœ“ โœ’ โœž โœ˜ โœ  โœ› โœ›โœข โœ™ โœ„ โœž โ˜Žโœ† โ˜Ž โœ„ โœœ โœ™ โœž โœ› โ„ โœฑ โœฟ โ‡ โœฌ โœฎ โœฟ โœถ โœถ โ„ โœฒ โ‰ โˆ โ† โœฟ โœฌ โœถ โ„ โœฏ โœซ โœฝ โ โ˜… โœฎ โ˜… โœฌ โœญ โœพโ˜… โŠ โ‹ โœฎ โ˜… โœฎ โ˜… โ€ โœฏ โ˜… โ˜… โœฌ โœฎ โœธ โœถ โœธ โœถ โœช โœฎ โœถ โ˜… โœฌ โœฟ โœญ โœง โœญ โœช โœซ โœง โœญโœฏ โœฟ โ‚ โœฎ โœฝ โœฎ โœถ โœช โœช โœฟ โœถ โœธ โœถโ… โœฎ โœฝ โœฎ โœง โœธ โœฝ โœฏ โ โœถ โœท โœฌ โ˜… โœฌ โœญโœฏ โœฝ โ‚ โœฎ โœถ โ˜… โœฎ โœธ โœฆ โ— โœฌ โ˜… โ‹ โœถ โ€ โ˜… โœถ โ‡ โœฟ โœฝ โœถ โœญโœฏ โœฟ โ˜… โœฎ โœซ โœฎ โ† Example: JDOM SAXBuilder โ‚โœชโœฉโ˜… โ–ผโœคโฏ Constructs products from an XML document. โœชโ‚โœฉโ˜… โ—†Pโญ โ—†โœนโž โชโœคโซ โœชโ‚โœฉโ˜… โ—†Pโญ โ–ผโœคโฏ โฑโโœโ› โœ—โœคโœฃ โ–ผโœคโฏ โ‚โœชโœฉโ˜… โ‚โโ–  โ–ผโœคโฏ โ–ผโœคโฏ โœซโœนโœธ โœซโœนโœธ โฒโจโณ โ‚โœชโœฉโ˜… โœชโœฉโ˜… โœ˜โœšโœ™ โ–ผโœคโฏ โ—†Pโ– โ—†Pโญโฑโœโ› โœงโœฉโ˜… โ–ผโœคโ˜ โ‚โโ–  โœฎโœฐโœฏ โ‚โœฉโ˜… โ—†Pโ– โ™โขโก โœฌโโŠ โ—†Pโ– โœซโœคโœฌ โœชโœฉโ˜… โœงโœฉโ˜… โœงโœฉโ˜… โœงโœฉโ˜… โ€ข

  80. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ โœ˜ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ” โœ  โœก โ˜Ž โœ† โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Structure Builder Director buildPart() ConcreteBuilder <<creates>> Product buildPart() getProduct() โœ—โœคโœฃ โœ˜โœšโœ™

  81. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ— โœ‚ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ˜ โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœ  โ˜Ž โœก โœž โœ โœ’ โœ“ โœ  โœ‘ โœŽโœ’ โœŽ โœ โœŒ โ˜ž Collaborations The client creates the Director object and โ€ข configures it with the desired Builder object โ€ข Director notifies the Builder whenever a part of the product should be built โ€ข Builder handles requests from the director and adds parts to the product โ€ข The client retrieves the product from the builder โœ—โœคโœฃ โœ˜โœšโœ™

  82. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ˜ โœ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ” โœ  โœก โ˜Ž โœ† โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Collaborations (contโ€™d) aClient : Client aDirector : aConcreteBuilder Director : ConcreteBuilder new ConcreteBuilder() new Director(aConcreteBuilder) construct() buildPartA() buildPartB() buildPartC() getResult() โœ—โœคโœฃ โœ˜โœšโœ™

  83. ๏ฟฝ โ˜Žโœ† โœ– โœ— โœ˜ โœ‚ โœ› โœž โœ™ โœœ โœ„ โ˜Ž โœž โ˜ž โœ„ โœ™ โœ›โœข โœ› โœ  โœž โœ› โœ’ โœ“ โœ’ โœ• โœ— โ˜ž โ˜› โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœŸ โœ† โœ” โœก โ˜Ž โœ  โœž โœ โœ’ โœ  โœŽโœ’ โœ‘ โœ“ โœŽ โœ โœŒ โ˜ž Consequences โ€ข Benefits โ€“ It lets you vary a productโ€™s internal representation โ€“ It isolates code for construction and representation โ€“ It gives you finer control over the construction process (object constructed step-by-step under the directorโ€™s control) โ€ข Disadvantages โ€“ N/A โœ—โœคโœฃ โœ˜โœšโœ™

  84. ๏ฟฝ โœ โœž โœ โœ’ โœ„ โœ† โœ โœ’ โœ“ โœ–โœ— โœ“ โœ• โœ˜ โœ„ โœ† โœ’ โ˜› โœ” โœ โœŒโœ โœ’ โœ โœ’ โœ“ โœ† โœ“ โœ„ โœž โœ  โœ• โœ“ โœ–โœ— โœ† โœŽ ๏ฟฝ โœ  โœ„ โœŽ โœŒโœ โœ โœ‚ โœ› โœŽ โœ โœ† โœ„ โœ’ โœŽ โœ„ โœš โœŽ โœž โœ„ โ˜› โœ’ โœ„ โœ† โœ™ โœ† โœŽ โœ† โœ  โœ† โœ“ โœŽ โœ† โœ“ โœŽ โœ„ โœŒโœ โœ โœ˜ โœ— โœ— โœ– โœ• โ˜ž โ˜ž โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœ โœŽ โœŒ โœ โœŸ โœ‚ โœ„ โ˜Ž โ˜Žโœ† โœ โœž โœ† โ˜ž โœ  โœก โ˜Ž โ˜› โœž โœ  โœ› โœž โœ™ โœ› โœ† โœ† โœžโœŸ โœ โœ‚ โœ† โœ ๏ฟฝ โœœ โœ’ โœ“ โœ’ โœž โœž โœ  โœ› โœ„ โœ›โœข โ˜Ž โ˜Žโœ† โœž โœ™ โœ„ Builder, Composite and Iterator Design Patterns often Relationship between Composite, โœ‚โ˜Žโœ„ Iterator, and Builder โœ—โœคโœฃ โœ‚โ˜Žโœ„ โœโœ‘โ˜› โœ˜โœšโœ™ โœกโ˜žโ˜› work together โœ‚โ˜Žโœ  โœ‚โ˜Žโœ„ โ€ข

  85. ๏ฟฝ โœ— โœ˜ โœ„ โœ† โœ โœ’ โœ“ โœ–โœ— โœ“ โœ• โœ˜ โœŽ โœ„ โœ† โœ  โœ  โœ โœฅ โœ˜ โœŽ โœ„ โœŒโœ โœ โœ˜ โœŽ โœง โœ“ โœ† โœ› โœ  โœฆ โ˜… โœ† โœ„ โœ„ โœš โœŽ โœ„ โœ’ โœ โœช โœ˜ โœŽ โœ“ โœ† โœ  โœŽ โœ† โœ  โœ™ โœ˜ โœ† โœ‚ โœŸ โœ โœ„ โœฉ โœง โœŒ โœฆ โœ˜ โœ„ โœ โœ โœฆ โœ› โ˜ž โœ— โœ– โœ• โ˜ž โ˜ž โœ” โœ’ โœ“ โœŽโœ’ โœ‘ โœ โœŽ โœ โœŒ โœ  โœ  โœž โ˜› โ˜Ž โœก โœ  โœ† โœŸ โœž โœ โ˜Žโœ† โ˜Ž โœ„ โœ‚ โœ โœ— โœ˜ โœŽ โœ  โœŽ โœ† โœ’ โœ โœฅ โœ˜ โœ’ โœ“ โœ’ โœ› โœž โœ› โœ› โ˜Žโœ† โœž โœ™ โœ›โœข โœ™ โœ„ โœœ โœ„ โœž โ˜Ž Summary of Patterns โœ—โœคโœฃ Discussedโ€ฆ โœ˜โœšโœ™ Behavioural Patterns: Creational Patterns: Structural Patterns: โœกโ˜žโ˜› โ€ข โ€ข โ€ข

Recommend


More recommend