Behavioral Patterns
•Defines the communication between objects.
•Dynamic behavior (changeable in runtime)
using polymorphism.
•Objects are able to talk each other, and still
loosely coupled!
Behavioral Patterns
•Defines the communication between objects.
•Dynamic behavior (changeable in runtime)
using polymorphism.
•Objects are able to talk each other, and still
loosely coupled!
Last Summer
Motivation
Define a one-to-many dependency
between objects, so that when one
object changes its state, all its
dependents are notified and
updated automatically.
Solution #1: Busy-wait
Solution #1: Busy-wait
Solution #2:
Notification through composition
Solution #2:
Notification through composition
for (Recipient x : recipients) {
if (x instanceof Android) {
sendAndroid(x, msg);
} else if (x instanceof IOS) {
sendiOS(x, msg);
}
...
}
Solution #2:
Notification through composition
for (Recipient x : recipients) {
if (x instanceof Android) {
sendAndroid(x, msg);
} else if (x instanceof IOS) {
sendiOS(x, msg);
}
...
}
Solution using Observer Pattern
Observer
Examples
•Event Listeners
•C# Delegates (register a function, and invoke it
later)
Observer Demo
Oref (HFC) Devices
Monitoring- response time,
errors
App
servers
Autoscaling
Logging
Logging
Monitoring- response time,
errors
App
servers
Autoscaling
Logging
Monitoring- response time,
errors
Application
Servers
(Mediator)
Mediator Pattern
•Define an object that encapsulates how a
set of objects interact.
•Mediator promotes
loose coupling by
keeping objects from
referring to each other
explicitly.
Mediator- Structure
Relationship
One-to-many
vs.
Many-to-many
Reusability
Responsibility
Possible Solution
•Use enum that represents the current
state / screen (watching, VOD menu,
EPG, etc.)
•Switch-case statement each time the
user clicks on a multi-state button.
enum State { CHANNEL_INFO, TV, VOD, EPG, MENU, GAMES }
class DigitalTVRemote {
State m_state;
public void menuButton() { ... }
public void infoButton() { ... }
public void exitButton() {
switch (m_state) {
case MENU:
m_state = TV;
showChannel();
break;
case VOD:
backButton();
break;
case CHANNEL_INFO:
m_state = TV;
hideChannelInfo();
break;
}
}
}
enum State { CHANNEL_INFO, TV, VOD, EPG, MENU, GAMES }
class DigitalTVRemote {
State m_state;
public void menuButton() { ... }
public void infoButton() { ... }
public void exitButton() {
switch (m_state) {
case MENU:
m_state = TV;
showChannel();
break;
case VOD:
backButton();
break;
case CHANNEL_INFO:
m_state = TV;
hideChannelInfo();
break;
}
}
}
Solution using State Pattern
State Pattern- Motivation
•An object-oriented State Machine.
•Allow an object to alter its behavior at
runtime when its internal state changes.
The object will appear to change its class
State Pattern- Structure
State- Pros & Cons
Pros:
•Provides an easy way to change the behavior of a
given object in runtime, based on its current state.
•Adding a new state is very easy.
Cons:
•Many classes which are not part of the system
design are added.
Strategy- Motivation
•Defines a family of algorithms, encapsulate
each one and make then interchangeable.
•Lets the algorithm vary independently from
the client that use it.
•Choose the preferred algorithm to solving the
problem, according to the current situation.
Strategy- Structure
Strategy- Pros & Cons
Pros:
•Provides an easy way to change the behavior of a
given object in runtime, based on the current situation.
•Adding a new algorithm is very easy.
Cons:
•Client must be aware of a different strategies.
•Creates many classes which are not part of the system
design directly.
State
Changing
who changes the state?
Encapsulation
When
to use
Problem
Problem
collection.sort();
collection.merge(c2);
collection.find(x);
Iterator- Motivation
•Provide a way to access the elements of an
aggregate object sequentially without
exposing its underlying implementation.
•Provides a uniform interface for traversing
different kinds of collections.
Iterator- Structure
Java Iterator
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
Java Iterator
List<Integer> arr = new ArrayList<Integer>();
Iterator it = arr.iterator();
Integer i = it.next();
// for loop using iterator
for (Iterator it = arr.iterator();
it.hasNext(); it.next()) { ... }
// Syntactic suger (foreach loop)
for (Integer i : arr) { ... }
Internal vs. External Iterator
•Internal- iteration controlled by the
iterator itself.
•External- client controls iteration
by requesting the next element.
Complex data
structures
Elements in the collection
may be removed
Visitor
Problem
Solution using Visitors
Motivation
•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 operates.
Structure
Visitor- Pros & Cons
Pros:
•Easy to add more services: just add a visitor
class.
Cons:
•Hard to add a new class to the original
hierarchy- need to change all the visitors!