1 LOGIC DESIGN EENG 210/CS 230/Phys 319 section 02 Dr. Ihab Talkhan.
CS 210 Introduction to Design Patterns September 7 th, 2006.
-
Upload
carmel-hutchinson -
Category
Documents
-
view
221 -
download
4
Transcript of CS 210 Introduction to Design Patterns September 7 th, 2006.
![Page 1: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/1.jpg)
CS 210
Introduction to Design Patterns
September 7th, 2006
![Page 2: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/2.jpg)
Head First Design Patterns
Chapter 2
Observer Pattern
![Page 3: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/3.jpg)
Weather Monitoring Application
Weather Station
HumiditySensor
TempSensor
PressureSensor
Weather DataObject
DisplayDevice
PullsData
displays
![Page 4: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/4.jpg)
What needs to be done?
/*
* Call this method
* whenever measurements are
* Updated
*/
Public void measurementsChanged(){
// your code goes here
}
WeatherData
getTemperature()getHumidity()getPressure()measurementsChanged()
Update threedifferent displays
![Page 5: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/5.jpg)
Problem specification
weatherData class has three getter methods
measurementsChanged() method called whenever there is a change
Three display methods needs to be supported: current conditions, weather statistics and simple forecast
System should be expandable
![Page 6: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/6.jpg)
First cut at implementationpublic class WeatherData {
public void measurementsChanged(){
float temp = getTemperature();
float humidity = getHumidity();
float pressure = getPressure();
currentConditionsDisplay.update (temp, humidity, pressure);
statisticsDisplay.update (temp, humidity, pressure);
forecastDisplay.update (temp, humidity, pressure);
}
// other methods
}
![Page 7: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/7.jpg)
First cut at implementationpublic class WeatherData {
public void measurementsChanged(){
float temp = getTemperature();
float humidity = getHumidity();
float pressure = getPressure();
currentConditionsDisplay.update (temp, humidity, pressure);
statisticsDisplay.update (temp, humidity, pressure);
forecastDisplay.update (temp, humidity, pressure);
}
// other methods
}By coding to concrete implementationsthere is no way to add additional displayelements without making code change
Area of change which can beManaged better by encapsulation
![Page 8: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/8.jpg)
Basis for observer pattern
Fashioned after the publish/subscribe model
Works off similar to any subscription model• Buying newspaper
• Magazines
• List servers
![Page 9: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/9.jpg)
Observer Pattern Defined
The Observer Pattern defines a one-to-many dependency between objects so
that when one object changes state, all of its dependents are notified and updated
automatically.
![Page 10: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/10.jpg)
Observer Pattern – Class diagram
<<interface>>Subject
registerObserver()removeObserver()notifyObservers()
<<interface>>Observer
Update()
observers
ConcreteSubject
registerObserver()removeObserver()notifyObservers()
ConcreteObserver
Update()
subject
![Page 11: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/11.jpg)
Observer pattern – power of loose coupling
The only thing that the subject knows about an observer is that it implements an interface
Observers can be added at any time and subject need not be modified to add observers
Subjects and observers can be reused or modified without impacting the other [as long as they honor the interface commitments]
![Page 12: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/12.jpg)
Observer Pattern – Weather data
<<interface>>Subject
registerObserver()removeObserver()notifyObservers()
<<interface>>Observer
update()
observers
WeatherData
registerObserver()removeObserver()notifyObservers()getTemperature()getPressure()measurementsChanged()
subject
<<interface>>DisplayElement
display()
StatisticsDisplay
update()display()
ForecastDisplay
update()display()
CurrentConditionsDisplay
update()display()
![Page 13: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/13.jpg)
Weather data interfaces
public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();
}public interface Observer {
public void update(float temp, float humidity, float pressure);}public interface DisplayElement {
public void display();}
![Page 14: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/14.jpg)
Implementing subject interface public class WeatherData implements Subject { private ArrayList observers; private float temperature; private float humidity; private float pressure;
public WeatherData() { observers = new ArrayList(); }
![Page 15: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/15.jpg)
Register and unregister
public void registerObserver(Observer o) {observers.add(o);
}
public void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {
observers.remove(i);}
}
![Page 16: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/16.jpg)
Notify methodspublic void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {Observer observer =
(Observer)observers.get(i);observer.update(temperature, humidity,
pressure);}
}
public void measurementsChanged() {notifyObservers();
}
![Page 17: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/17.jpg)
Observer pattern
More analysis
![Page 18: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/18.jpg)
Push or pull
The notification approach used so far pushes all the state to all the observers
One can also just send a notification that some thing has changed and let the observers pull the state information
Java observer pattern support has built in support for both push and pull in notification
![Page 19: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/19.jpg)
Java Observer Pattern – Weather data
Observable
addObserver()deleteObserver()notifyObservers()setChanged()
<<interface>>Observer
update()
observers
WeatherData
registerObserver()removeObserver()notifyObservers()getTemperature()getPressure()measurementsChanged()
subject
<<interface>>DisplayElement
display()
StatisticsDisplay
update()display()
ForecastDisplay
update()display()
CurrentConditionsDisplay
update()display()
Observable is a classAnd not an interface
![Page 20: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/20.jpg)
Java implementation
Look at API documentation• java.util.Observable
• java.util.Observer
Look at weather station re-implementation
![Page 21: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/21.jpg)
Problems with Java implementation Observable is a class
• You have to subclass it
• You cannot add observable behavior to an existing class that already extends another superclass
• You have to program to an implementation – not interface Observable protects crucial methods
• Methods such as setChanged() are protected and not accessible unless one subclasses Observable.
• You cannot favor composition over inheritance. You may have to roll your own observer interface if Java
utilities don’t work for your application
![Page 22: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/22.jpg)
Other uses of the Observer pattern in Java
GUI interface classes – JButton Look at Java API for AbstractButton and
JButton
![Page 23: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/23.jpg)
Summary so far..
Observer pattern defines one-to-many relationship between objects
You can use push or pull with observer pattern
Java has several implementations of observer pattern – in util, swing, javabeans and RMI
Swing makes heavy use of this pattern
![Page 24: CS 210 Introduction to Design Patterns September 7 th, 2006.](https://reader036.fdocuments.net/reader036/viewer/2022081519/56649eb55503460f94bbd298/html5/thumbnails/24.jpg)
Summary so far.. OO Basics
• Encapsulation• Inheritance• Polymorphism
OO Principles• Encapsulate what varies• Favor composition over
inheritance• Program to interfaces not to
implementations• Strive for loosely coupled
designs between objects that interact
OO Patterns• The Observer Pattern
defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.
• The Strategy Pattern defines a family of algorithms, Encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.