Slideshare.net (beta)

 

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 16 (more)

GoF Design Patterns

From ddebowczyk, 1 year ago

An Introduction to Gang of Four Design Patterns - Douglas C. Schmi more

7795 views  |  2 comments  |  16 favorites  |  3 embeds (Stats)
Download not available ?
 

Tags

design patterns gof vlissides diagrams uml ooad object oriented pattern programing

more

 
 

Groups / Events

 

 
Embed
options

More Info

CC Attribution License
This slideshow is Public
Total Views: 7795
on Slideshare: 7785
from embeds: 10

Slideshow transcript

Slide 1: An Introduction to Design Patterns Douglas C. Schmidt Vanderbilt University schmidt@dre.vanderbilt.edu Based on material produced by John Vlissides 1

Slide 2: Overview Part I: Motivation & Concept the issue  what design patterns are  what they’re good for  how we develop & categorize them  2

Slide 3: Overview (cont’d) Part II: Application use patterns to design a document editor  demonstrate usage & benefits  Part III: Wrap-Up observations, caveats, & conclusion  3

Slide 4: Part I: Motivation & Concept OOD methods emphasize design notations Fine for specification, documentation But OOD is more than just drawing diagrams Good draftsmen  good designers Good OO designers rely on lots of experience At least as important as syntax Most powerful reuse is design reuse Match problem to design experience 4

Slide 5: Part I: Motivation & Concept (cont’d) Recurring Design Structures OO systems exhibit recurring structures that promote abstraction  flexibility  modularity  elegance  Therein lies valuable design knowledge Problem: capturing, communicating, & applying this knowledge 5

Slide 6: Part I: Motivation & Concept (cont’d) A Design Pattern… • abstracts a recurring design structure • comprises class and/or object dependencies  structures  interactions  conventions  • names & specifies the design structure explicitly • distills design experience 6

Slide 7: Part I: Motivation & Concept (cont’d) Four Basic Parts  Name  Problem (including “forces”)  Solution  Consequences & trade-offs of application Language- & implementation-independent A “micro-architecture” Adjunct to existing methodologies (RUP, Fusion, SCRUM, etc.) 7

Slide 8: Part I: Motivation & Concept (cont’d) Example: OBSERVER 8

Slide 9: Part I: Motivation & Concept (cont’d) Goals Codify good design distill & generalize experience  aid to novices & experts alike  Give design structures explicit names common vocabulary  reduced complexity  greater expressiveness  Capture & preserve design information articulate design decisions succinctly  improve documentation  Facilitate restructuring/refactoring patterns are interrelated  9 additional flexibility 

Slide 10: Part I: Motivation & Concept (cont’d) Design Space for GoF Patterns Scope: domain over which a pattern applies Purpose: reflects what a pattern does 10

Slide 11: Part I: Motivation & Concept (cont’d) Design Pattern Template (1st half) NAME scope purpose Intent short description of the pattern & its purpose Also Known As short description of the pattern & its purpose Motivation motivating scenario demonstrating pattern’s use Applicability circumstances in which pattern applies Structure graphical representation of the pattern using modified OMT notation Participants participating classes and/or objects & their responsibilities 11

Slide 12: Part I: Motivation & Concept (cont’d) Design Pattern Template (2nd half) ... Collaborations how participants cooperate to carry out their responsibilities Consequences the results of application, benefits, liabilities Implementation pitfalls, hints, techniques, plus language-dependent issues Sample Code sample implementations in C++, Java, C#, Smalltalk, C, etc. Known Uses examples drawn from existing systems Related Patterns discussion of other patterns that relate to this one 12

Slide 13: Part I: Motivation & Concept (cont’d) Modified UML/OMT Notation 13

Slide 14: Motivation & Concept (cont’d) OBSERVER object behavioral Intent define a one-to-many dependency between objects so that when one object changes state, all dependents are notified & updated Applicability an abstraction has two aspects, one dependent on the other  a change to one object requires changing untold others  an object should notify unknown other objects  Structure 14

Slide 15: Motivation & Concept (cont’d) OBSERVER (cont’d) object behavioral Consequences + modularity: subject & observers may vary independently + extensibility: can define & add any number of observers + customizability: different observers offer different views of subject – unexpected updates: observers don’t know about each other – update overhead: might need hints or filtering Implementation subject-observer mapping  dangling references  update protocols: the push & pull models  registering modifications of interest explicitly  Known Uses Smalltalk Model-View-Controller (MVC)  InterViews (Subjects & Views, Observer/Observable)  Andrew (Data Objects & Views)  15 Mailing lists 

Slide 16: Part I: Motivation & Concept (cont’d) Benefits of Patterns • Design reuse • Uniform design vocabulary • Enhance understanding, restructuring, & team communication • Basis for automation • Transcends language-centric biases/myopia • Abstracts away from many unimportant details 16

Slide 17: Part I: Motivation & Concept (cont’d) Liabilities of Patterns • Require significant tedious & error-prone human effort to handcraft pattern implementations design reuse • Can be deceptively simple uniform design vocabulary • Leaves some important details unresolved 17

Slide 18: Part II: Application: Document Editor (Lexi) 7 Design Problems  Document structure  Formatting  Embellishment  Multiple look & feels  Multiple window systems  User operations  Spelling checking & hyphenation 18

Slide 19: Document Structure Goals: present document’s visual aspects  drawing, hit detection, alignment  support physical structure  (e.g., lines, columns) Constraints/forces: treat text & graphics uniformly  no distinction between one & many  19

Slide 20: Document Structure (cont’d) Solution: Recursive Composition 20

Slide 21: Document Structure (cont’d) Object Structure 21

Slide 22: Document Structure (cont’d) Glyph Base class for composable graphical objects Basic interface: Task Operations appearance void draw(Window) hit detection boolean intersects(Coord, Coord) structure void insert(Glyph) void remove(Glyph) Glyph child(int) Glyph parent() Subclasses: Character, Image, Space, Row, Column 22

Slide 23: Document Structure (cont’d) Glyph Hierarchy Note the inherent recursion in this hierarchy  i.e., a Row is a Glyph & a Row also has Glyphs! 23

Slide 24: Document Structure (cont’d) COMPOSITE object structural Intent treat individual objects & multiple, recursively-composed objects uniformly Applicability objects must be composed recursively, and no distinction between individual & composed elements, and objects in structure can be treated uniformly Structure 24

Slide 25: Document Structure (cont’d) COMPOSITE (cont’d) object structural Consequences + uniformity: treat components the same regardless of complexity + extensibility: new Component subclasses work wherever old ones do – overhead: might need prohibitive numbers of objects Implementation do Components know their parents?  uniform interface for both leaves & composites?  don’t allocate storage for children in Component base class  responsibility for deleting children  Known Uses ET++ Vobjects  InterViews Glyphs, Styles  Unidraw Components, MacroCommands  25

Slide 26: Formatting Goals: automatic linebreaking, justification  Constraints/forces: support multiple linebreaking algorithms  don’t tightly couple these algorithms with  the document structure 26

Slide 27: Formatting (cont’d) Solution: Encapsulate Linebreaking Strategy Compositor base class abstracts linebreaking algorithm  subclasses for specialized algorithms,  e.g., SimpleCompositor, TeXCompositor Composition composite glyph  supplied a compositor & leaf glyphs  creates row-column structure as directed by  compositor 27

Slide 28: Formatting (cont’d) New Object Structure Generated in accordance with compositor strategies & do not affect contents of leaf glyphs 28

Slide 29: Formatting (cont’d) STRATEGY object behavioral Intent define a family of algorithms, encapsulate each one, & make them interchangeable to let clients & algorithms vary independently Applicability when an object should be configurable with one of many algorithms, and all algorithms can be encapsulated, and one interface covers all encapsulations Structure 29

Slide 30: Formatting (cont’d) STRATEGY (cont’d) object behavioral Consequences + greater flexibility, reuse + can change algorithms dynamically – strategy creation & communication overhead – inflexible Strategy interface – semantic incompatibility of multiple strategies used together Implementation exchanging information between a Strategy & its context  static strategy selection via templates  Known Uses InterViews text formatting  RTL register allocation & scheduling strategies  ET++SwapsManager calculation engines  See Also 30 Bridge pattern (object structural) 

Slide 31: Embellishment Goals: add a frame around text composition  add scrolling capability  Constraints: embellishments should be reusable without  subclassing, i.e., so they can be added dynamically at runtime should go unnoticed by clients  31

Slide 32: Embellishment (cont’d) Solution: “Transparent” Enclosure Monoglyph base class for glyphs having one child  operations on MonoGlyph pass through to child  MonoGlyph subclasses: Frame: adds a border of specified width  Scroller: scrolls/clips child, adds scrollbars  32

Slide 33: Embellishment (cont’d) MonoGlyph Hierarchy void Frame::draw (Window &w) { // Order may be important! MonoGlyph::draw (w); void MonoGlyph::draw (Window &w) { drawFrame (w); component->draw (w); } } 33

Slide 34: Embellishment (cont’d) New Object Structure 34

Slide 35: Embellishment (cont’d) DECORATOR object structural Intent augment objects with new responsibilities Applicability when extension by subclassing is impractical  for responsibilities that can be withdrawn  Structure 35

Slide 36: Embellishment (cont’d) DECORATOR (cont’d) object structural Consequences + responsibilities can be added/removed at run-time + avoids subclass explosion + recursive nesting allows multiple responsibilities – interface occlusion – identity crisis Implementation interface conformance  use a lightweight, abstract base class for Decorator  heavyweight base classes make Strategy more attractive  Known Uses embellishment objects from most OO-GUI toolkits  ParcPlace PassivityWrapper  InterViews DebuggingGlyph  36

Slide 37: Multiple Look & Feels Goals: support multiple look & feel standards  generic, Motif, Swing, PM, Macintosh,  Windows, ... extensible for future standards  Constraints: don’t recode existing widgets or clients  switch look & feel without recompiling  37

Slide 38: Multiple Look & Feels (cont’d) Solution: Abstract Object Creation Instead of Scrollbar *sb = new MotifScrollbar(); use Scrollbar *sb = factory->createScrollbar(); where factory is an instance of MotifFactory • BTW, this begs the question of who created the factory! 38

Slide 39: Multiple Look & Feels (cont’d) Factory Interface • defines “manufacturing interface” • subclasses produce specific products • subclass instance chosen at run-time // This class is essentially a Java interface class Factory { public: Scrollbar *createScrollbar() = 0; Menu *createMenu() = 0; ... }; 39

Slide 40: Multiple Look & Feels (cont’d) Factory Structure Scrollbar *MotifFactory::createScrollBar () { return new MotifScrollbar(); } Scrollbar *PMFactory::createScrollBar () { return new PMScrollbar(); 40 }

Slide 41: Multiple Look & Feels (cont’d) ABSTRACT FACTORY object creational Intent create families of related objects without specifying class names Applicability when clients cannot anticipate groups of classes to instantiate Structure 41

Slide 42: Multiple Look & Feels (cont’d) ABSTRACT FACTORY (cont’d) object creational Consequences + flexibility: removes type dependencies from clients + abstraction: hides product’s composition – hard to extend factory interface to create new products Implementation parameterization as a way of controlling interface size  configuration with Prototypes, i.e., determines who creates the  factories Known Uses InterViews Kits  ET++ WindowSystem  AWT Toolkit  42

Slide 43: Multiple Window Systems Goals: make composition appear in a window  support multiple window systems  Constraints: minimize window system dependencies in  application & framework code 43

Slide 44: Multiple Window Systems (cont’d) Solution: Encapsulate Implementation Dependencies Window user-level window abstraction  displays a glyph (structure)  window system-independent  task-related subclasses  (e.g., IconWindow, PopupWindow) 44

Slide 45: Multiple Window Systems (cont’d) Window Interface class Window { public: ... void iconify(); // window-management void raise(); ... void drawLine(...); // device-independent void drawText(...); // graphics interface ... }; 45

Slide 46: Multiple Window Systems (cont’d) Window uses a WindowRep • abstract implementation interface • encapsulates window system dependencies • window systems-specific subclasses (e.g., XWindowRep, SunWindowRep) An Abstract Factory can produce the right WindowRep! 46

Slide 47: Multiple Window Systems (cont’d) Window/WindowRep Structure void Character::draw (Window &w) { w.drawText(...); } void Window::drawText (...) { rep->deviceText(...); } void XWindowRep::deviceText (...) { XText(...); 47 }

Slide 48: Multiple Window Systems (cont’d) New Object Structure Note the decoupling between the logical structure of the contents in a window from the physical rendering of the contents in the window 48

Slide 49: Multiple Window Systems (cont’d) BRIDGE object structural Intent separate a (logical) abstraction interface from its (physical) implementation(s) Applicability when interface & implementation should vary independently  require a uniform interface to interchangeable class hierarchies  Structure 49

Slide 50: Multiple Window Systems (cont’d) BRIDGE (cont’d) object structural Consequences + abstraction interface & implementation are independent + implementations can vary dynamically – one-size-fits-all Abstraction & Implementor interfaces Implementation sharing Implementors & reference counting  creating the right implementor  Known Uses ET++ Window/WindowPort  libg++ Set/{LinkedList, HashTable}  AWT Component/ComponentPeer  50

Slide 51: User Operations Goals: support execution of user operations  support unlimited-level undo  Constraints: scattered operation implementations  must store undo state  not all operations are undoable  51

Slide 52: User Operations (cont’d) Solution: Encapsulate Each Request A Command encapsulates an operation (execute())  an inverse operation (unexecute())  a operation for testing reversibility  (boolean reversible()) state for (un)doing the operation  Command may implement the operations itself, or  delegate them to other object(s)  52

Slide 53: User Operations (cont’d) Command Hierarchy void PasteCommand::execute () { // do the paste } void CopyCommand::execute () { // do the copy } void MenuItem::clicked () { command->execute(); } 53

Slide 54: User Operations (cont’d) List of Commands = Execution History Undo: Redo: unexecute() unexecute() execute() cmd cmd past future future past 54

Slide 55: User Operations (cont’d) COMMAND object behavioral Intent encapsulate the request for a service Applicability to parameterize objects with an action to perform  to specify, queue, & execute requests at different times  for multilevel undo/redo  Structure 55

Slide 56: User Operations (cont’d) COMMAND (cont’d) object behavioral Consequences + abstracts executor of a service + supports arbitrary-level undo-redo + composition yields macro-commands – might result in lots of trivial command subclasses Implementation copying a command before putting it on a history list  handling hysteresis  supporting transactions  Known Uses InterViews Actions  MacApp, Unidraw Commands  JDK’s UndoableEdit, AccessibleAction 56 

Slide 57: Spelling Checking & Hyphenation Goals: analyze text for spelling errors  introduce potential hyphenation sites  Constraints: support multiple algorithms  don’t tightly couple algorithms with  document structure 57

Slide 58: Spelling Checking & Hyphenation (cont’d) Solution: Encapsulate Traversal Iterator encapsulates a  traversal algorithm without exposing representation details to callers uses Glyph’s child  enumeration operation This is an example  of a “preorder iterator” 58

Slide 59: Spelling Checking & Hyphenation (cont’d) ITERATOR object behavioral Intent access elements of a container without exposing its representation Applicability require multiple traversal algorithms over a container  require a uniform traversal interface over different containers  when container classes & traversal algorithm must vary  independently Structure 59

Slide 60: Spelling Checking & Hyphenation (cont’d) ITERATOR (cont’d) object behavioral Iterators are used heavily in the C++ Standard Template Library (STL) int main (int argc, char *argv[]) { vector<string> args; for (int i = 0; i < argc; i++) args.push_back (string (argv[i])); for (vector<string>::iterator i (args.begin ()); i != args.end (); i++) cout << *i; The same iterator pattern can be applied to any STL container! cout << endl; return 0; 60 }

Slide 61: Spelling Checking & Hyphenation (cont’d) ITERATOR (cont’d) object behavioral Consequences + flexibility: aggregate & traversal are independent + multiple iterators & multiple traversal algorithms – additional communication overhead between iterator & aggregate Implementation internal versus external iterators  violating the object structure’s encapsulation  robust iterators  Known Uses C++ STL iterators  JDK Enumeration, Iterator  Unidraw Iterator 61 

Slide 62: Spelling Checking & Hyphenation (cont’d) Visitor • defines action(s) at each step of traversal • avoids wiring action(s) into Glyphs • iterator calls glyph’s accept(Visitor) at each node • accept() calls back on visitor (a form of “static polymorphism” based on method overloading by type) void Character::accept (Visitor &v) { v.visit (*this); } class Visitor { public: virtual void visit (Character &); virtual void visit (Rectangle &); virtual void visit (Row &); // etc. for all relevant Glyph subclasses 62 };

Slide 63: Spelling Checking & Hyphenation (cont’d) SpellingCheckerVisitor • gets character code from each character glyph Can define getCharCode() operation just on Character() class • checks words accumulated from character glyphs • combine with PreorderIterator class SpellCheckerVisitor : public Visitor { public: void visit (Character &); void visit (Rectangle &); void visit (Row &); // etc. for all relevant Glyph subclasses }; 63

Slide 64: Spelling Checking & Hyphenation (cont’d) Accumulating Words Spelling check performed when a nonalphabetic character it reached 64

Slide 65: Spelling Checking & Hyphenation (cont’d) Interaction Diagram • The iterator controls the order in which accept() is called on each glyph in the composition • accept() then “visits” the glyph to perform the desired action • The Visitor can be subclassed to implement various desired actions 65

Slide 66: Spelling Checking & Hyphenation (cont’d) HyphenationVisitor • gets character code from each character glyph • examines words accumulated from character glyphs • at potential hyphenation point, inserts a... class HyphenationVisitor : public Visitor { public: void visit (Character &); void visit (Rectangle &); void visit (Row &); // etc. for all relevant Glyph subclasses }; 66

Slide 67: Spelling Checking & Hyphenation (cont’d) Discretionary Glyph • looks like a hyphen when at end of a line • has no appearance otherwise • Compositor considers its presence when determining linebreaks 67

Slide 68: Spelling Checking & Hyphenation (cont’d) VISITOR object behavioral Intent centralize operations on an object structure so that they can vary independently but still behave polymorphically Applicability when classes define many unrelated operations  class relationships of objects in the structure rarely change,  but the operations on them change often algorithms keep state that’s updated during traversal  Structure 68

Slide 69: Spelling Checking & Hyphenation (cont’d) VISITOR (cont’d) object behavioral Consequences + flexibility: visitor & object structure are independent + localized functionality – circular dependency between Visitor & Element interfaces – Visitor brittle to new ConcreteElement classes Implementation double dispatch  general interface to elements of object structure  Known Uses ProgramNodeEnumerator in Smalltalk-80 compiler  IRIS Inventor scene rendering  TAO IDL compiler to handle different backends  69

Slide 70: Part III: Wrap-Up Observations Patterns are applicable in all stages of the OO lifecycle design & reviews  realization & documentation  reuse & refactoring  Patterns permit design at a more abstract level treat many class/object interactions as a unit  often beneficial after initial design  targets for class refactorings  Variation-oriented design consider what design aspects are variable  identify applicable pattern(s)  vary patterns to evaluate tradeoffs  70 repeat 

Slide 71: Part III: Wrap-Up (cont’d) But… Don’t apply them blindly Added indirection can yield increased complexity, cost Resist branding everything a pattern Articulate specific benefits Demonstrate wide applicability Find at least three existing examples from code other than your own! Pattern design even harder than OO design! 71

Slide 72: Part III: Wrap-Up (cont’d) Concluding Remarks • design reuse • uniform design vocabulary • understanding, restructuring, & team communication • provides the basis for automation • a “new” way to think about design 72

Slide 73: Pattern References Books The Timeless Way of Building, Alexander, ISBN 0-19-502402-8 A Pattern Language, Alexander, 0-19-501-919-9 Design Patterns, Gamma, et al., 0-201-63361-2 CD version 0-201-63498-8 Pattern-Oriented Software Architecture, Buschmann, et al., 0-471-95869-7 Pattern-Oriented Software Architecture, Vol. 2, Schmidt, et al., 0-471-60695-2 Pattern-Oriented Software Architecture, Vol. 3, Jain & Kircher, et al., 0-470-84525-2 Analysis Patterns, Fowler; 0-201-89542-0 73

Slide 74: Pattern References (cont’d) More Books Concurrent Programming in Java, 2nd ed., Lea, 0-201-31009- 0 Pattern Languages of Program Design Vol. 1, Coplien, et al., eds., ISBN 0-201-60734-4 Vol. 2, Vlissides, et al., eds., 0-201-89527-7 Vol. 3, Martin, et al., eds., 0-201-31011-2 Vol. 4, Harrison, et al., eds., 0-201-43304-4 AntiPatterns, Brown, et al., 0-471-19713-0 Applying UML & Patterns, 2nd ed., Larman, 0-13-092569-1 Pattern Hatching, Vlissides, 0-201-43293-5 The Pattern Almanac 2000, Rising, 0-201-61567-3 74

Slide 75: Pattern References (cont’d) Even More Books Small Memory Software, Noble & Weir, 0-201-59607-5 Microsoft Visual Basic Design Patterns, Stamatakis, 1-572- 31957-7 Smalltalk Best Practice Patterns, Beck; 0-13-476904-X The Design Patterns Smalltalk Companion, Alpert, et al., 0-201-18462-1 Modern C++ Design, Alexandrescu, ISBN 0-201-70431-5 Building Parsers with Java, Metsker, 0-201-71962-2 75

Slide 76: Pattern References (cont’d) New Books Core J2EE Patterns, Alur, et al., 0-130-64884-1 Design Patterns Explained, Shalloway & Trott, 0-201- 71594-5 The Joy of Patterns, Goldfedder, 0-201-65759-7 The Manager Pool, Olson & Stimmel, 0-201-72583-5 76

Slide 77: Pattern References (cont’d) Early Papers “Object-Oriented Patterns,” P. Coad; Comm. of the ACM, 9/92 “Documenting Frameworks using Patterns,” R. Johnson; OOPSLA ’92 “Design Patterns: Abstraction & Reuse of Object-Oriented Design,” Gamma, Helm, Johnson, Vlissides, ECOOP ’93 Articles Java Report, Java Pro, JOOP, Dr. Dobb’s Journal, Java Developers Journal, C++ Report 77

Slide 78: Pattern-Oriented Conferences PLoP 2006: Pattern Languages of Programs October 2006, Collocated with OOPSLA EuroPLoP 2006, July 2006, Kloster Irsee, Germany … See hillside.net/conferencesnavigation.htm for up-to-the-minute info. 78

Slide 79: Mailing Lists patterns@cs.uiuc.edu: present & refine patterns patterns-discussion@cs.uiuc.edu: general discussion gang-of-4-patterns@cs.uiuc.edu: discussion on Design Patterns siemens-patterns@cs.uiuc.edu: discussion on Pattern-Oriented Software Architecture ui-patterns@cs.uiuc.edu: discussion on user interface patterns business-patterns@cs.uiuc.edu: discussion on patterns for business processes ipc-patterns@cs.uiuc.edu: discussion on patterns for distributed systems See http://hillside.net/patterns/mailing.htm for an up-to-date list. 79