Design patterns: An Introduction to Software Design Patterns
Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially...
Transcript of Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially...
![Page 1: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/1.jpg)
Design PatternsCSCE 740 - Lecture 17 - 10/26/2017(Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)
![Page 2: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/2.jpg)
OO Design Exercise:Building a Better Duck
Duck
quack()swim()fly()display()
// Other Methods
MallardDuck
display() { .. }
RedheadDuck
display() { .. } …
2
![Page 3: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/3.jpg)
Adding new ducks
Duck
quack()swim()fly()display()
// Other Methods
MallardDuck
display() { .. }
RedheadDuck
display() { .. }
RubberDuck
display() { .. }
3
![Page 4: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/4.jpg)
Why not override?
Duck
quack()swim()fly()display()
// Other Methods
MallardDuck
display() { .. }
RedheadDuck
display() { .. }
RubberDuck
display() { .. } @Override fly() {.. }
WoodenDuck
display() { .. } @Override quack() { .. }@Override fly() {.. }
4
![Page 5: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/5.jpg)
Why not interfaces?
Duck
swim()display()
// Other Methods
MallardDuck
display() { .. } fly() { .. }quack() { .. }
RedheadDuck
display() { .. } fly() { .. }quack { .. }
RubberDuck
display() { .. } quack() {... }
WoodenDuck
display() { .. }
<<interface>>Flyable
fly()
<<interface>>Quackable
quack()
5
![Page 6: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/6.jpg)
How do we fix this mess?
Apply good OO design principles!
Step 1: Identify the aspects that vary and encapsulate them.
Duck Flying class behaviors
6
![Page 7: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/7.jpg)
Step 2: Implement behaviors as classes
Principle - Program to an interface, not an implementation.
(BAD)Programming to an implementation:MallardDuck d = new MallardDuck();d.flyWithWings();Requires knowing what type of duck you’re using, and what methods it has.
MallardDuck
flyWithWings()quackLoudly()swim()display()
(BETTER… BUT NOT GREAT)Inherit and override.Duck d = new MallardDuck();d.fly();Still requires reimplementing the same behaviors multiple times.
Duck
swim()display()
MallardDuck
fly();quack();
Duck
swim()fly()quack()display()
(GOOD)Programming to an interface:Duck d = new MallardDuck()d.performFly();Flying/Quacking behavior called in the same way for all ducks. Only implement specific version of behavior once.
<<interface>>FlyBehavior
fly()
FlyWithWings
fly() { .. }
FlyNotAllowed
fly() { .. }
Duck
FlyBehavior flyBQuackBehavior quackB
performQuack()performFly()swim()display()
performFly() {flyB.fly();
}
7
![Page 8: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/8.jpg)
HAS-A can be better than IS-A
Principle: Favor composition over inheritance.<<interface>>FlyBehavior
fly()
FlyWithWings
fly() { .. }
FlyNotAllowed
fly() { .. }
Duck
FlyBehavior flyBQuackBehavior quackB
performQuack()performFly()swim()display()setFlyBehavior()setQuackBehavior() <<interface>>
QuackBehavior
quack()
NormalQuack
quack() { .. }
Squeek
quack() { .. }
MallardDuck
display() { .. }
RedheadDuck
display() { .. }
RubberDuck
display() { .. }
8
![Page 9: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/9.jpg)
Challenge - Duck Call
A duck call is a device that hunters use to mimic the sound of a duck. How would you implement a duck call in this framework?
9
![Page 10: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/10.jpg)
Enter... Design patterns
Don’t just describe classes, describe problems.
Patterns prescribe designguidelines for common problem types.
10
![Page 11: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/11.jpg)
Guidelines, not solutions
“Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem in such a way that you can use this solution a million times over, without ever doing it the same way twice.”
- Christopher Alexander
11
![Page 12: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/12.jpg)
Categories of design patterns
1. BehavioralDescribe how objects interact.
2. Creational Decouple a client from objects it instantiates.
3. StructuralClean organization into subsystems.
12
![Page 13: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/13.jpg)
Why use design patterns?
1. Good examples of OO principles.2. Faster design phase.3. Evidence that system will support change.4. Offers shared vocabulary between designers.
13
![Page 14: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/14.jpg)
You already applied one pattern
Strategy Pattern
Defines a family of algorithms, encapsulates them, makes them interchangeable.
14
![Page 15: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/15.jpg)
Observer Pattern - Motivation
15
![Page 16: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/16.jpg)
Observer Pattern - Definition
Subject Object
Change Request
Subscriber Objects
Object
Object
Object
Updated Data
Updated Data
Updated Data
(When data changes, subscribers are notifed)
(These objects have subscribed to the Subject to receive updates when data changes)
update(){// do something
}update(){
// do something}
update(){// do something
}Subscribe
16
![Page 17: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/17.jpg)
Observer Pattern ExamplePet Feeding
Food Bowl
Dog
Cat
Mouse
addObserver();
fillBowl(“puppy chow”);
fillBowl(String food){notify();// ....
}notify(){ for o in observers{
o.update();}
}
update();
update(){ if (bowl.getFood() ==
“puppy chow”)eat();
}
update(){ if (bowl.getFood() !=
“ahi tuna”)angryMeow();
}
removeObserver(Mouse);
update(){ if (bowl.GetObservers()
contains Cat)removeObserver(this);
elseeat();
}17
![Page 18: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/18.jpg)
Observer Pattern - In Practice<<interface>>Observable
addObserver(Observer)removeObserver(Observer)notify()
<<interface>>Observer
update()
observersConcreteObservable
State stateList<ConcreteObserver> observers
addObserver(ConcreteObserver)removeObserver(ConcreteObserver)notify()getState()setState()
ConcreteObserver
ConcreteObservable subject
update()setSubject(ConcreteObservable)// Action methods
1
*
update(){ state= subject.getState()}
notify() { for observer in observers{ observer.update() }}
1
1
subject
18
![Page 19: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/19.jpg)
Benefits of Observer Pattern
When objects are loosely coupled, they can interact while lacking knowledge of each other.
1. Can add new observers at anytime.
2. Never need to modify subject.
3. Easy code reuse.4. Easy change.
19
![Page 20: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/20.jpg)
Visitor Pattern - Motivation
20
![Page 21: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/21.jpg)
Visitor Pattern - Definition
Visitor
Collection
ItemSet
Item
accept(Visitor)
accept(Visitor)
accept(Visitor)
Item
Item
Client
visit(Collection)
(The client wants to perform actions using data from some structure)
(Visitors can traverse the data structure and gather information.)
(Items are instructed to tell the visitorwho they are.)
accept(Visitor)
accept(Visitor)
visit(Item)
(The items tell the visitor what they are, and the visitor acts accordingly)
21
![Page 22: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/22.jpg)
Visitor Pattern ExampleGrocery Checkout
Cart
Dairy Products
Cheese
Ramen
Milk
Cashier
Tag Scanner
visit(Cart);
accept(TagScanner);
accept(visitor){for(item in Items())
item.accept(visitor);}
accept(visitor);
accept(visitor);accept(visitor);
accept(visitor){visitor.visit(this);
}
visit(Cheese);visit(Cheese c){
price+= c.getPrice();}
22
![Page 23: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/23.jpg)
Visitor Pattern - In Practice
<<interface>>Visitor
visit(ConcreteElementA)visit(ConcreteElementB)
<<interface>>Element
accept(ConcreteVisitor)
Client
ConcreteVisitor
visit(ConcreteElementA)visit(ConcreteElementB)
ConcreteElementA
List<ConcreteElementB> members
accept(ConcreteVisitor)getMembers()
ConcreteElementB
accept(ConcreteVisitor)
accept(ConcreteVisitor visitor){ for element in this.getMembers(){ element.accept(visitor)}
accept(ConcreteVisitor visitor){ visitor.visit(this)}
23
![Page 24: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/24.jpg)
Benefits of Visitor Pattern
1. Can add operations to a collection without changing the collection structure.
2. Thus, adding new functionality and operations is easy.
3. Operation code is centralized.
24
![Page 25: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/25.jpg)
Activity
Building a weather monitoring application.Generates three displays: current conditions, weather statistics, simple forecast.Design system using either visitor or observer pattern.
Provided: To Implement:
Physical Hardware
Humidity Sensor
Temperature SensorPressure Sensor
Display Hardware
Weather Data System
Pulls data from.
Displays to
25
![Page 26: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/26.jpg)
Activity Solution - Observer Pattern<<interface>>Observable
addObserver(observer)removeObserver(observer)notify()
<<interface>>Observer
update()
WeatherData
List<Observer> Displays
addObserver(Observer)removeObserver(Observer)notify()
getTemperature()getHumidity()getPressure()measurementsChanged()
CurrentConditionsDisplay
WeatherData data
update()display()
<<interface>>Display
display()
ForecastDisplay
WeatherData data
update()display()
StatisticsDisplay
WeatherData data
update()display()
26
![Page 27: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/27.jpg)
Factory Pattern - Motivation
27
![Page 28: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/28.jpg)
Factory Pattern - Motivation
Pizza orderPizza(){Pizza pizza = new Pizza();
pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;
}28
![Page 29: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/29.jpg)
Factory Pattern - Motivation
Pizza orderPizza(String type){Pizza pizza;if (type.equals(“cheese”)){
pizza = new CheesePizza();else if(type.equals(“pepperoni”)){
pizza = new PepperoniPizza();} // Prep methods
}29
![Page 30: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/30.jpg)
Factory Pattern - Motivation
Pizza orderPizza(String type){Pizza pizza;if (type.equals(“cheese”)){
pizza = new CheesePizza();else if(type.equals(“pepperoni”)){
pizza = new PepperoniPizza();} else if(type.equals(“veggie”)){
pizza = new VeggiePizza();}// Prep methods
}30
![Page 31: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/31.jpg)
Factory Pattern - Motivation
Pizza orderPizza(String type){Pizza pizza;
pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;
}
SimplePizzaFactory
31
![Page 32: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/32.jpg)
The Simple Factory
PizzaStore
SimplePizzaFactory factory
orderPizza(String)
SimplePizzaFactory
createPizza(String)
<<interface>>Pizza
prepare()bake()cut()box()
CheesePizza
prepare()bake()cut()box()
PepperoniPizza
prepare()bake()cut()box()
VeggiePizza
prepare()bake()cut()box()
Pizza createPizza(String s){if(s.equals(“Pepperoni”))
return new PepperoniPizza();
// Other pizza types}
32
![Page 33: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/33.jpg)
Franchising the Factory
PizzaStore
PizzaFactory factory
orderPizza(String)
<<interface>>Pizza
prepare()bake()cut()box()
NYPepperoniPizza
prepare()bake()cut()box()
NYVeggiePizza
prepare()bake()cut()box()
ChicagoVeggiePizza
prepare()bake()cut()box()
ChicagoPepperoniPizza
prepare()bake()cut()box()
<<interface>>PizzaFactory
createPizza(String)
NewYorkPizzaFactory
createPizza(String)
ChicagoPizzaFactory
createPizza(String)
33
![Page 34: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/34.jpg)
Factory Pattern - Definition
Defines an interface for creating an object, but lets subclasses decide which object to instantiate. Allows reasoning about creators and products.
<<interface>>PizzaFactory
createPizza(String)
NewYorkPizzaFactory
createPizza(String)
ChicagoPizzaFactory
createPizza(String)
<<interface>>Pizza
prepare()bake()cut()box()
NYVeggiePizza
prepare()bake()cut()box()
ChicagoVeggiePizza
prepare()bake()cut()box()
34
![Page 35: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/35.jpg)
Factory Pattern - In PracticeClient
<<interface>>ProductA
// methods
<<interface>>Factory
createProductA()createProductB()
ConcreteFactory1
createProductA()createProductB()
ConcreteFactory2
createProductA()createProductB()
<<interface>>ProductB
// methods
ConcreteProductA1
ConcreteProductB1
ConcreteProductB2
ConcreteProductA2
35
![Page 36: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/36.jpg)
Benefits of Factory Pattern
1. Loose coupling.2. Creation code is
centralized.3. Easy to add new
classes.4. Lowered class
dependency (can depend on abstractions, not concrete classes).
36
![Page 37: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/37.jpg)
Why not use a design pattern?
● Potentially over-engineered solution.● Increased system complexity.● Design inefficiency.
How can we avoid these pitfalls?
What are the drawbacks to using patterns?
37
![Page 38: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/38.jpg)
Resources
Web:● oodesign.com● c2.com/cgi/wiki?PatternIndex
Book: ● Head First Design Patterns, by Eric Freeman, Bert
Bates, Kathy Sierra, and Elisabeth Robson. ● Design Patterns: Elements of Reusable Object Oriented
Software, by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides (Gang of Four)
38
![Page 39: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/39.jpg)
We Have Learned
When in doubt:1. Reason about the problem, then the objects.2. Patterns provide templates for OO design.
Patterns come in many flavors.Think about patterns and BILL (hint, hint).
39
![Page 40: Design Patterns - GitHub Pages · Design Patterns CSCE 740 - Lecture 17 - 10/26/2017 (Partially adapted from Head First Design Patterns by Freeman, Bates, Sierra, and Robson)](https://reader033.fdocuments.us/reader033/viewer/2022041603/5e321a40d103eb4b472787e6/html5/thumbnails/40.jpg)
Next Time
● Design Patterns, round 2● Homework
○ Questions on class diagrams?
40