33
OBSERVER DESIGN PATTERN

OBSERVER DESIGN PATTERN. Behavioral Patterns Behavioral patterns are those patterns that are most specifically concerned with communication between

Embed Size (px)

Citation preview

Page 1: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

OBSERVER DESIGN PATTERN

Page 2: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Behavioral Patterns

Behavioral patterns are those patterns that are most specifically concerned with communication between objects

Page 3: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Introduction

Name Observer

Also Known As Dependents, Publish-Subscribe

Page 4: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Observer

Intent Defines a one-to-many dependency between

objects so that when one object changes state, all its dependents are notified and updated automatically

Use the Observer pattern: When an abstraction has two aspects, one

dependent on the other. When a change to one object requires

changing others, and you don't know how many objects need to be changed

When an object should be able to notify other objects without making assumptions about who these objects are.

Page 5: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Structure

Page 6: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Participants

Subject knows its observers. Any number of Observer objects may

observe a subject. provides an interface for attaching and detaching Observer

objects. Observer

defines an updating interface for objects that should be notified of changes in a subject.

ConcreteSubject stores state of interest to ConcreteObserver objects. sends a notification to its observers when its state changes.

ConcreteObserver maintains a reference to a ConcreteSubject object. stores state that should stay consistent with the subject's. implements the Observer updating interface to keep its state

consistent with the subject's.

Page 7: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Collaborations

Page 8: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

SpreadSheet Example

Page 9: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

SpreadSheet Example How to implement a spreadsheet?

Page 10: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Java's Implementation

Java API implements a framework for this pattern Java's observer interface is the Observer abstract

class in the pattern Java's Observable class is the Subject abstract

class in the pattern Class java.util.Observable

Observable object may have any number of Observers Whenever the Observable instance changes,

it notifies all of its observers Notification is done by calling the update() method on all

observers. Interface java.util.Observer

When implemented, this interface allows all classes to be observable by instances of class Observer

Page 11: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

java.util.Observable Methods addObserver(Observer)

Adds an observer to the observer list. countObservers()

Counts the number of observers. deleteObserver(Observer)

Deletes an observer from the observer list. deleteObservers()

Deletes observers from the observer list. hasChanged()

Returns a true boolean if an observable change has occurred.

Page 12: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

java.util.Observable Methods notifyObservers()

Notifies all observers if an observable change occurs. notifyObservers(Object)

Notifies all observers of the specified observable change which occurred.

setChanged() Sets a flag to note an observable change.

Interface java.util.Observer Update()

Called when observers in the observable list need to be updated

Page 13: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

A Java Example The Classes

indicates interface

Page 14: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Class Descriptions

Counter

A Counter can increase or decrease by one. Each time a counter changes value, it notifies its observers of the type of change.

IncreaseDectector

IncreaseDetector is an observer that observes counters. IncreaseDetector counts the number of times one of its observables increases. It notifies its observers when it changes

Page 15: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Class Descriptions

CounterButton

Abstract class for changing a counter each time the button is pressed IncreaseButton

A button that increases a counter each time the button is pressed

DecreaseButton

A button that decreases a counter each time the button is pressed

Page 16: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Class Descriptions

CounterViewA parent window view that observes a counter. Does nothing with counter. Used as parent for other views.CounterTextViewA window for displaying the value of a counter in ASCII. ButtonControllerA window for changing the value of a counter using IncreaseButton and DecreaseButton.RectangleViewDraws a colored rectangle that depends on two counters. One counter is the width of the rectangle, the other counter is the height of the rectangle. The color of rectangle varies with its shape.

Page 17: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class Counter /** A counter can increase/decrease by 1. Each time a counter changes value, it notifies its observers of the

type of change. */

class Counter extends Observable {

public static final String INCREASE = "increase";

public static final String DECREASE = "decrease";

private int count = 0; private String label;

public Counter( String label ) { this.label = label; }

public String label() { return label; }

public int value() { return count; }

public String toString() { return String.valueOf( count );}

public void increase() {

count++; setChanged();

notifyObservers( INCREASE );

}

public void decrease() {

count--;

setChanged();

notifyObservers( DECREASE );

}

}

Page 18: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class IncreaseDetector

/** * IncreaseDetector is an observer that observes counters.

*IncreaseDetector counts the number of times one of its

* observables increases. */

class IncreaseDetector extends Counter implements Observer {

public IncreaseDetector( String label ) {

super( label );

}

public void update( Observable whatChanged, Object message) {

if ( message.equals( Counter.INCREASE) ) increase();

}

}

Page 19: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

abstract class CounterButton /** * An abstract class for changing a counter each time the button is

pressed */abstract class CounterButton extends Button { protected Counter count; public CounterButton( String buttonName, Counter count ) { super( buttonName ); this.count = count; }

public boolean action( Event processNow, Object argument ) { changeCounter(); return true; }

abstract protected void changeCounter(); }

Page 20: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class IncreaseButton

/** * A button that increases a counter each time it is pressed */

class IncreaseButton extends CounterButton {

public IncreaseButton( Counter count ) {

super( "Increase", count );

}

protected void changeCounter() {

count.increase();

}

}

Page 21: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class DecreaseButton

/** * A button that decreases a counter each time it is pressed */

class DecreaseButton extends CounterButton {

public DecreaseButton( Counter count ) {

super( "Decrease", count );

}

protected void changeCounter() {

count.decrease();

}

}

Page 22: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class CounterView

/** * A parent window view that observes a counter */

class CounterView extends Frame implements Observer {

public CounterView( String label, int x, int y, int width, int height ) {

setTitle( label );

reshape(x, y, width, height );

setLayout( new FlowLayout() );

}

/** * Redraw the window when an observed counter changes */

public void update(Observable counter, Object argument) {

repaint();

}

}

Page 23: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class CounterTextView

/** * A window for displaying the value of a counter in ascii */ class CounterTextView extends CounterView { Counter model; public CounterTextView( Counter model, String label, int x, int y, int width, int height

) { super( label, x, y, width, height ); this.model = model; model.addObserver( this ); show(); } public void paint( Graphics display ) { int y = bounds().height - 20; int x = 20; display.drawString( "The value of " + model.label() + " is " + model ,

x, y ); }}

Page 24: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class ButtonController

/** * A window for changing the value of a counter */ class ButtonController extends CounterView { public ButtonController( Counter model, int x, int y, int width, int

height ) { super( model.label(), x, y, width, height ); model.addObserver( this ); // show the value of the counter new CounterTextView( model, "Value of " + model.label(), x + width + 5,y, 150, 50); // buttons to change counter add( new IncreaseButton( model )); add( new DecreaseButton( model )); show(); } }

Page 25: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class RectangleView

/** * Draws a colored rectangle that depends on two counters. One counter is the width, the other counter is the height of the rectangle. The color of rectangle varies with its shape */

class RectangleView extends CounterView { Counter width; Counter height;

public RectangleView( Counter rectWidth, Counter rectHeight, int x, int y ) {

super( "Rectangle", x, y, 150, 150 ); height = rectHeight; width = rectWidth; rectWidth.addObserver( this ); rectHeight.addObserver( this ); show(); }

Page 26: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

class RectangleView Continued

public void paint( Graphics display ) { int x = 10; int y = 10; // Magnify value by 5 to get a bigger visual effect int height = 5 * this.height.value(); int width = 5 * this.width.value(); // Determine color. Colors chosen for fun. // The factor of 3 is just to magnify effect of change if (( width >= 0 ) && ( height >= 0 )) display.setColor( new Color( 3*width, 3*height, width + height) ); else if (( width < 0 ) && ( height >= 0 )) display.setColor( Color.pink ); else if (( width >= 0 ) && ( height < 0 )) display.setColor( Color.orange ); else if (( width < 0 ) && ( height < 0 )) display.setColor( Color.red );

display.fillRect(x, y, Math.abs(width), Math.abs( height ) ); }}

Page 27: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Sample Program

class TestButton {

public static void main( String args[] ) {

Counter x = new Counter( "x" );

Counter y = new Counter( "y" );

IncreaseDetector plus = new IncreaseDetector( "Pluses" );

x.addObserver( plus );

y.addObserver( plus );

new ButtonControler( x, 30, 30, 150, 50 );

new ButtonControler( y, 30, 100, 150, 50 );

new CounterTextView( plus, "# of increases", 30, 170, 150, 50);

new RectangleView( x, y, 340, 30 );

}

}

Page 28: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Sample Program

Page 29: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Runtime Object Interaction

Page 30: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Consequences

Abstract coupling between Subject and Observer

Support for broadcast communication Unexpected updates

Simple change in subject can cause numerous updates, which can be expensive or distracting

Updates can take too long Subject can not perform any work until all

observers are done

Page 31: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Implementation Issues

Mapping subjects(Observables) to observers Use list (or hash table) in subject

Observing more than one subject If an observer has more than one subject how does it

know which one changed? Pass information in the update method

Dangling references to Deleted Subjects Deleting a subject should not produce dangling

references in its observers Make the subject notify its observers deleting the observers is not an option

Page 32: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Push Model

At one extreme, which we call the push model

The subject sends observers detailed information about the change, whether they want it or not the push model assumes subjects know something

about their observers' needs The push model might make observers less

reusable Subject classes make assumptions about Observer

classes that might not always be true

Page 33: OBSERVER DESIGN PATTERN. Behavioral Patterns  Behavioral patterns are those patterns that are most specifically concerned with communication between

Pull Model

At the other extreme is the pull model the subject sends nothing but the most

minimal notification, and observers ask for details explicitly thereafter

The pull model emphasizes the subject's ignorance of its observers

the pull model may be inefficient Observer classes must ascertain what

changed without help from the Subject