applying design patterns in practice
TRANSCRIPT
![Page 2: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/2.jpg)
Warm-up exercise
![Page 3: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/3.jpg)
Which pattern is this?
a)Visitorpa+ern b)Factorymethodpa+ern c)Templatemethodpa+ern d)Iteratorpa+ern
![Page 4: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/4.jpg)
Which pattern is this?
a)Decoratorpa+ernb)Compositepa+ernc)Adapterpa+ernd)Model-View-Controller(MVC)pa+ern
![Page 5: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/5.jpg)
Which pattern is this?
Calendar calendar = b.set(YEAR, 2003).set(MONTH, APRIL).set(DATE, 6).set(HOUR, 15).set(MINUTE, 45).set(SECOND, 22).setTimeZone(TimeZone.getDefault()).build();
a) Factorymethodpa+ernb) Abstractfactorypa+ernc) Builderpa+ernd) Decoratorpa+ern
![Page 6: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/6.jpg)
Which pattern is this?
a)Bridgepa+ernb)Abstractfactorypa+ernc)Builderpa+ernd)Strategypa+ern
![Page 7: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/7.jpg)
Which pattern is this?
a)Bridgepa+ernb)Decoratorpa+ernc)Builderpa+ernd)Strategypa+ern
LineNumberReader lnr = new LineNumberReader( new BufferedReader( new FileReader(“./test.c")));
String str = null;
while((str = lnr.readLine()) != null) System.out.println(lnr.getLineNumber() + ": " + str);
![Page 8: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/8.jpg)
“Applying design principles is the key to creating high-quality software!”
Architectural principles: Axis, symmetry, rhythm, datum, hierarchy, transformation
![Page 9: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/9.jpg)
Technology changes fast => FOMO
![Page 10: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/10.jpg)
Focus on “ever green” topics!
![Page 11: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/11.jpg)
For architects: design is the key!
![Page 12: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/12.jpg)
What are design patterns?
recurrent solutions to common design problems
Pattern Name Problem Solution Consequences
![Page 13: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/13.jpg)
Why care about patterns?❖ Patterns capture expert
knowledge in the form of proven reusable solutions ❖ Better to reuse proven
solutions than to “re-invent” the wheel
❖ When used correctly, patterns positively influence software quality ❖ Creates maintainable,
extensible, and reusable code
![Page 14: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/14.jpg)
3 principles behind patterns
Program to an interface, not to an implementation
Favor object composition over inheritance
Encapsulate what varies
![Page 15: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/15.jpg)
What is refactoring?Refactoring (noun): a change
made to the internal structure of software to make it easier to understand and cheaper to modify without changing its
observable behavior
Refactor (verb): to restructure software by applying a series
of refactorings without changing its observable
behavior
![Page 16: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/16.jpg)
Smells approach to learn patterns
![Page 17: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/17.jpg)
Scenario
enum ColorScheme { RGB, HSB, HLS, CMYK } class Color {
private float red, green, blue; // for supporting RGB scheme private float hue1, saturation1, brightness1; // for supporting HSB scheme private float hue2, lightness2, saturation2; // for supporting HLS schemepublic Color(float arg1, float arg2, float arg3, ColorScheme cs) {
switch (cs) {// initialize arg1, arg2, and arg3 based on ColorScheme value
}}
}
• Assume that you need to support different Color schemes in your software• RGB (Red, Green, Blue), HSB (Hue, Saturation, Brightness), and HLS (Hue,
Lightness, and Saturation) schemes• Overloading constructors and differentiating them using enums can become
confusing • What could be a better design?
![Page 18: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/18.jpg)
A solution using Factory Method pattern
Color
+ GetRGBColor()+ GetHSBColor()+ GetHLSColor()
RGBColor
- red : float- green : float - blue : float
HSBColor
- hue : float- saturation : float - brightness : float
HLSColor
- hue : float- lightness : float - saturation : float
![Page 19: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/19.jpg)
A solution using Factory Method pattern
Color
+ GetColor(ColorType)+ …
RGBColor
- red : float- green : float - blue : float
HSBColor
- hue : float- saturation : float - brightness : float
HLSColor
- hue : float- lightness : float - saturation : float
![Page 20: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/20.jpg)
Factory Method pattern: Structure
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 21: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/21.jpg)
Factory method pattern: Discussion
❖ A class cannot anticipate the class of objects it must create
❖ A class wants its subclasses to specify the objects it creates
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclasses.
❖ Delegate the responsibility to one of the several helper subclasses
❖ Also, localize the knowledge of which subclass is the delegate
![Page 22: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/22.jpg)
Factory method: Java library example
Loggerlogger=Logger.getLogger(TestFileLogger.class.getName());
![Page 23: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/23.jpg)
Factory method: Java library example
class SimpleThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { return new Thread(r); }}
![Page 24: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/24.jpg)
Scenario
public Locale (String language, // e.g. “en" for English String script, // e.g., “Arab” for Arabic
String country, // e.g., “us” for United States String variant, // e.g., “TH” for Thai LocaleExtensions extensions) // e.g., “ca-buddhist” for Thai Buddhist Calendar
• Assume that you have a Locale class constructor that takes many “optional constructors”
• Constraint: Only certain variants are allowed - you need to “disallow” inappropriate combinations(e.g., invalid combination of country and variant) by throwing IllformedLocaleException.
• Overloading constructors will result in “too many constructors” • How will you design a solution for this?
![Page 25: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/25.jpg)
Recommended solution
Locale aLocale = new Locale.Builder().setLanguage(“sr").setScript(“Latn").setRegion("RS").build();
• Create a Locale Builder that “builds” and returns an object step-by-step• Validation will be performed by the individual set methods • The build() method will return the “built” object
![Page 26: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/26.jpg)
Builder pattern: structure
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 27: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/27.jpg)
Builer pattern: Discussion
❖ Creating or assembling a complex object can be tedious
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
❖ Make the algorithm for creating a complex object independent of parts that make up the object and how they are assembled
❖ The construction process allows different representations for the object that is constructed
![Page 28: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/28.jpg)
Builders common for complex classes
Calendar.Builder b = new Calendar.Builder(); Calendar calendar = b
.set(YEAR, 2003)
.set(MONTH, APRIL)
.set(DATE, 6)
.set(HOUR, 15)
.set(MINUTE, 45)
.set(SECOND, 22)
.setTimeZone(TimeZone.getDefault())
.build();System.out.println(calendar);
![Page 29: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/29.jpg)
Scenario
❖ Consider a Route class in an application like Google Maps
❖ For finding shortest path from source to destination, many algorithms can be used
❖ The problem is that these algorithms get embedded into Route class and cannot be reused easily (smell!)
Route
+ SetRoute(Location, Location)+ FindShortestPathJohnson() + FindShortestDijkstra()+ FindShortestBellmanFord()+ …
How will you refactor such thata) Support for shortest path algorithm can be added easily? b) Separate path finding logic from dealing with location information.
![Page 30: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/30.jpg)
How about this solution?
ShortestPathAlgos
+ FindPath()
JohnsonsAlgo DijkstrasAlgo
Route
+ SetRoute(Location, Location)
+ ShortestPath()+ …
![Page 31: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/31.jpg)
You’re right: Its Strategy pattern!
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 32: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/32.jpg)
Strategy pattern: Discussion
❖ Useful when there is a set of related algorithms and a client object needs to be able to dynamically pick and choose an algorithm that suits its current need
Defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary
independently from clients that use it
❖ The implementation of each of the algorithms is kept in a separate class referred to as a strategy.
❖ An object that uses a Strategy object is referred to as a context object.
❖ Changing the behavior of a Context object is a matter of changing its Strategy object to the one that implements the required algorithm
![Page 33: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/33.jpg)
Wait, what principle did we apply?
![Page 34: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/34.jpg)
Open Closed Principle (OCP)
Bertrand Meyer
Software entities should be open for extension, but closed for modification
![Page 35: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/35.jpg)
SOLID principles• There&should&never&be&more&than&one&reason&for&a&class&to&change&&
Single'Responsibility'Principle'(SRP)'
• So6ware&en88es&(classes,&modules,&func8ons,&etc.)&should&be&open&for&extension,&but&closed&for&modifica8on&
Open'Closed'Principle'(OCP)'
• Pointers&or&references&to&base&classes&must&be&able&to&use&objects&of&derived&classes&without&knowing&it&
Liskov’s'Subs<tu<on'Principle'(LSP)'
• Depend&on&abstrac8ons,¬&on&concre8ons&Dependency'Inversion'Principle'(DIP)'
• Many&clientGspecific&interfaces&are&beHer&than&one&generalGpurpose&interface&
Interface'Segrega<on'Principle'(ISP)'
![Page 36: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/36.jpg)
Variation Encapsulation Principle (VEP)
Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides
Encapsulate the concept that varies
![Page 37: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/37.jpg)
Fundamental principle: Encapsulation
The principle of encapsulation advocates separation of concerns andinformation hiding through techniques such as hiding implementation
details of abstractions and hiding variations
![Page 38: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/38.jpg)
What do you mean by “principle”?
“Design principles are key notions considered fundamental to many different software design approaches and concepts. They are also called
enabling techniques.” - SWEBOK ‘04
![Page 39: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/39.jpg)
Design determines qualities
Understandability Changeability Extensibility
Reusability Testability Reliability
DESIGNimpacts
impactsimpacts
![Page 40: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/40.jpg)
ScenarioInitial design
TextView
+ Draw()
BorderedTextView
+ Draw()+ DrawBorder()
![Page 41: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/41.jpg)
Real scenario
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 42: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/42.jpg)
Supporting new requirementsRevised design with new requirements
TextView
+ Draw()
BorderedTextView
+ Draw()+ DrawBorder()
ScrollableTextView ScrollableBorderedTextView
- borderWidth
+ Draw()+ ScrollTo()
- ScrollPosition
+ Draw()+ ScrollTo()+ DrawBorder()
- ScrollPosition- borderWidth
![Page 43: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/43.jpg)
Scenario
❖ How will you refactor such that:❖ You don't have to “multiply-
out” sub-types? (i.e., avoid “explosion of classes”)
❖ You can add or remove responsibilities (e.g., scrolling)?
Next change: smelly design
![Page 44: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/44.jpg)
How about this solution?VisualComponent
+ Draw()
TextView
+ Draw()
ScrollDecortor BorderDecorator
+ Draw()+ ScrollTo()
- ScrollPosition
+ Draw()+ DrawBorder()
- borderWidth
Decorator
+ Draw() component->Draw()
Decorator::Draw()DrawBorder()
Decorator::Draw()ScrollTo()
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 45: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/45.jpg)
Can you identify the pattern?VisualComponent
+ Draw()
TextView
+ Draw()
ScrollDecortor BorderDecorator
+ Draw()+ ScrollTo()
- ScrollPosition
+ Draw()+ DrawBorder()
- borderWidth
Decorator
+ Draw() component->Draw()
Decorator::Draw()DrawBorder()
Decorator::Draw()ScrollTo()
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 46: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/46.jpg)
You’re right: Its Decorator pattern!
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 47: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/47.jpg)
Decorator pattern: Discussion
❖ Want to add responsibilities to individual objects (not an entire class)
❖ One way is to use inheritance
❖ Inflexible; static choice
❖ Hard to add and remove responsibilities dynamically
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality
❖ Add responsibilities through decoration
❖ in a way transparent to the clients
❖ Decorator forwards the requests to the contained component to perform additional actions
❖ Can nest recursively
❖ Can add an unlimited number of responsibilities dynamically
![Page 48: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/48.jpg)
Identify pattern used in this code
LineNumberReader lnr = new LineNumberReader( new BufferedReader( new FileReader(“./test.c")));
String str = null;
while((str = lnr.readLine()) != null) System.out.println(lnr.getLineNumber() + ": " + str);
![Page 49: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/49.jpg)
Decorator pattern in Reader
![Page 50: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/50.jpg)
Decorator pattern extensively used in library designs
![Page 51: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/51.jpg)
Scenarioa) How do we treat files
and folders alike?b) How can we handle
shortcuts?
File
+ GetName()+ GetSize()+ …
- name: String- size: int- type: FileType- data: char[]- …
Folder
+ GetName()+ GetFiles()+ GetFolders()+ …
- name: String - files[]: File- folders[]: Folder
![Page 52: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/52.jpg)
How about this solution?FileItem
+ GetName()+ GetSize()+ Add(FileItem)+ Remove(FileItem)
Folder
+ GetFiles()+ …
File
- files: FileItem
+ GetType()+ GetContents()+ …
- type: FileType- data: char[]
Shortcut
+ GetLinkedFileItem()+ …
- linkToFile: FileItem
![Page 53: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/53.jpg)
Composite pattern
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 54: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/54.jpg)
Composite pattern: Discussion
❖ There are many situations where a group of components form larger components
❖ Simplistic approach: Make container component contain primitive ones ❖ Problem: Code has to treat
container and primitive components differently
Compose objects into tree structures to represent part-whole hierarchies. Composite lets client treat individual objects and compositions of objects uniformly.
❖ Perform recursive composition of components❖ Clients don’t have to
treat container and primitive components differently
![Page 55: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/55.jpg)
Decorator vs. CompositeDecorator and composite structure looks similar:
Decorator is a degenerate form of Composite!
Decorator Composite
At max. one component Can have many components
Adds responsibilities Aggregates objects
Does not make sense to have methods such as Add(),
Remove(), GetChid() etc.
Has methods such as Add(), Remove(), GetChild(), etc.
![Page 56: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/56.jpg)
Composite pattern extensively used in library designs
![Page 57: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/57.jpg)
ScenarioHow to separate:a) code generation logic
from node types?b) how to support different
target types?
class Plus extends Expr { private Expr left, right; public Plus(Expr arg1, Expr arg2) { left = arg1; right = arg2; } public void genCode() { left.genCode(); right.genCode(); if(t == Target.JVM) { System.out.println("iadd"); } else { // DOTNET System.out.println("add"); } }}
![Page 58: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/58.jpg)
Group exercise - Understanding visitor pattern
![Page 59: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/59.jpg)
A solution using Visitor patternclass Plus extends Expr { private Expr left, right; public Plus(Expr arg1, Expr arg2) { left = arg1; right = arg2; } public Expr getLeft() { return left; } public Expr getRight() { return right; } public void accept(Visitor v) { v.visit(this); }}
class DOTNETVisitor extends Visitor { public void visit(Constant arg) { System.out.println("ldarg " + arg.getVal()); } public void visit(Plus plus) { genCode(plus.getLeft()); genCode(plus.getRight()); System.out.println("add"); } public void visit(Sub sub) { genCode(sub.getLeft()); genCode(sub.getRight()); System.out.println("sub"); } public void genCode(Expr expr) { expr.accept(this); }}
![Page 60: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/60.jpg)
Visitor pattern: structure
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 61: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/61.jpg)
Visitor pattern: call sequence
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
![Page 62: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/62.jpg)
Visitor pattern: Discussion
❖ Many distinct and unrelated operations need to be performed on objects in an object structure, and you want to avoid “polluting” their classes with these operations
Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the
elements on which it operations
❖ Create two class hierarchies: ❖ One for the elements
being operated on❖ One for the visitors that
define operations on the elements
![Page 63: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/63.jpg)
Patterns discussed so far✓ Builder pattern
✓ Factory method pattern
✓ Strategy pattern
✓ Decorator pattern
✓ Composite pattern
✓ Visitor pattern
Can you recap these patterns?
![Page 64: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/64.jpg)
What architectural style is this?
![Page 65: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/65.jpg)
Real-world pipes-and-filters
sediment pre-carbon ultra-filter post-
carbonFiltered water
![Page 66: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/66.jpg)
Pipe-and-filter style
![Page 67: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/67.jpg)
Pipe-and-filter: Benefits
+ Flexibility by filter exchange
+ Flexibility by recombination
+ Reuse of filter components
+ Rapid prototyping of pipelines
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, Inc., NY, USA.
![Page 68: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/68.jpg)
Pipe-and-filter: Liabilities
- Sharing state information is expensive or inflexible
- Efficiency gain by parallel processing is often an illusion
- Data transformation overhead
- Difficult to handle errors
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, Inc., NY, USA.
![Page 69: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/69.jpg)
What are your takeaways?
![Page 70: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/70.jpg)
![Page 71: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/71.jpg)
![Page 72: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/72.jpg)
![Page 73: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/73.jpg)
![Page 75: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/75.jpg)
“Applying design principles is the key to creating high-quality software!”
Architectural principles: Axis, symmetry, rhythm, datum, hierarchy, transformation
![Page 76: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/76.jpg)
Image/video credits❖ http://en.wikipedia.org/wiki/Fear_of_missing_out❖ http://lesliejanemoran.blogspot.in/2010_05_01_archive.html❖ http://javra.eu/wp-content/uploads/2013/07/angry_laptop2.jpg❖ https://www.youtube.com/watch?v=5R8XHrfJkeg❖ http://womenworld.org/image/052013/31/113745161.jpg
❖ http://www.fantom-xp.com/wallpapers/33/I'm_not_sure.jpg❖ https://www.flickr.com/photos/31457017@N00/453784086 ❖ https://www.gradtouch.com/uploads/images/question3.jpg❖ http://gurujohn.files.wordpress.com/2008/06/bookcover0001.jpg ❖ http://upload.wikimedia.org/wikipedia/commons/d/d5/Martin_Fowler_-_Swipe_Conference_2012.jpg❖ http://www.codeproject.com/KB/architecture/csdespat_2/dpcs_br.gif ❖ http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Bertrand_Meyer_IMG_2481.jpg/440px-
Bertrand_Meyer_IMG_2481.jpg
❖ http://takeji-soft.up.n.seesaa.net/takeji-soft/image/GOF-OOPLSA-94-Color-75.jpg?d=a0 ❖ https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/OOP_ObjC/Art/watchcalls_35.gif❖ http://www.pluspack.com/files/billeder/Newsletter/25/takeaway_bag.png ❖ http://cdn1.tnwcdn.com/wp-content/blogs.dir/1/files/2013/03/design.jpg
![Page 77: Applying Design Patterns in Practice](https://reader031.vdocuments.net/reader031/viewer/2022013013/58ed8c041a28abf60d8b4699/html5/thumbnails/77.jpg)
[email protected] @GSamarthyam
www.codeops.tech slideshare.net/sgganesh
+91 98801 64463 bit.ly/ganeshsg