Download presentation
Presentation is loading. Please wait.
1
Week 6, Class 2: Observer Pattern
4/18/2019 Week 6, Class 2: Observer Pattern Today The Observer pattern Half-Exam 2: Week 7 Friday 17q2 1-3,6-7,9-12 SE-2811 Slide design: Dr. Mark L. Hornick Content: Dr. Hornick Errors: Dr. Yoder Dr. Yoder
2
SE-2811 4/18/2019 If you think the internet is not working in its current incarnation, you can’t change the system through think-pieces and F.C.C. regulations alone. You need new code [... you need cryptocurrency!]. Stephen Johnson, "Beyond the Bitcoin Bubble,” New York Times, Jan 15th 2018 [Interpretation added] 18q2-7-1 SE-2811 Dr. Mark L. Hornick Dr. Yoder
3
Motivating application: Microsoft Word
How to update toolbars every time user clicks somewhere different in the document? [Demo in the real MSWord] SE-2811 Dr. Mark L. Hornick
4
Solution 1: (What kind of cohesion is this?)
SE-2811 4/18/2019 Solution 1: (What kind of cohesion is this?) public void onClick(ClickEvent e) { if(cursorInBoldText()) { boldButton.setHighlight(); } styleDialog.setStyle(getCurrentCursorStyle()); if(selection.isActive()) { copyButton.setActive(); } /*… etc. … */ SE-2811 Dr. Yoder Dr. Yoder
5
Observer Pattern Context
A system contains objects exhibiting: One-to-many dependency between objects One object changes state All dependents are notified and updated automatically SE-2811 Slide content originally by Dr. Hornick
6
What are we trying to achieve with the Observer Pattern ?
Separation of software subsystems Separation between GUI & Domain objects Loosely-coupled classes to … Avoid editing code in multiple places Increase reusability Increase understanding Avoid polling A generic/elegant way for the classes to communicate SE-2811 Slide content originally by Dr. Hornick
7
Key components in the Observer Pattern
Subject Subject has dependent observers. Observer(s) When the state of the subject changes, each dependent observer is notified. SE-2811 Slide content originally by Dr. Hornick
8
Slide content originally by Dr. Hornick
Generic Subject class class SubjectClass implements Subject { public SubjectClass(); public void attach(Observer obs); public void detach(Observer obs); public void notifyObservers(); private ArrayList <Observer> observers; } Subject::attach(Observer* pObserver) { m_hObservers.push_back(pObserver); } Subject::detach(Observer* pObserver) m_hObservers.remove(pObserver); Subject::notify() Vector<Observer*>::iterator m_ppObserver; for (m_ppObserver = m_hObservers.begin();m_ppObserver = m_hObservers.end(); ++m_ppObserver) (*m_ppObserver)->update(); Note: Some texts define a notify() instead of notifyObservers() method. However, Java’s Object class already has a notify() method, which we don’t want to override. SE-2811 Slide content originally by Dr. Hornick
9
Slide content originally by Dr. Hornick
Generic Observer class ObserverClass implements Observer { public ObserverClass(); public void update(???); } What is the appropriate argument for the update() method? SE-2811 Slide content originally by Dr. Hornick
10
Basic class relationships
SE-2811 4/18/2019 Basic class relationships 18q2-7-1: Updated to resolve several issues SE-2811 Slide content originally by Dr. Hornick Dr. Yoder
11
Collaborations between objects in the Observer pattern
s:SubjectClass o1:ObserverClass1 o2:ObserverClass2 attach() attach() notifyObservers() update(???) getContextSpecificInfo() update(???) getContextSpecificInfo() SE-2811 Slide content originally by Dr. Hornick
12
Implementation Questions
What should the arguments of the update method be? Should we send the Subject as the argument? Should each instance of the Observer store the “concrete subject” as a data attribute, or just an Interface reference, or something else? Can Subject be an interface instead of an abstract class? SE-2811 Slide content originally by Dr. Hornick
13
Polling without Observer pattern
4/18/2019 Polling without Observer pattern s:SubjectClass o1:ObserverClass1 o2:ObserverClass2 changeState() getContextSpecificInfo() Not to be confused with "pole" or "polling" getContextSpecificInfo() getContextSpecificInfo() Dr. Yoder
14
Push in Observer Pattern
4/18/2019 Push in Observer Pattern s:SubjectClass o1:ObserverClass1 o2:ObserverClass2 attach() attach() notifyObservers() update(State coolStuff) update(State coolStuff) Dr. Yoder
15
Pull in Observer Pattern
4/18/2019 Pull in Observer Pattern s:SubjectClass o1:ObserverClass1 o2:ObserverClass2 attach() attach() notifyObservers() update() Not to be confused with "pole" or "polling" getContextSpecificInfo() update() getContextSpecificInfo() Dr. Yoder
16
Comparing Push and Pull
SE-2811 4/18/2019 Comparing Push and Pull In teams of 2 or 3 Write two lists, one containing the advantages of push, the other, of pull. Write as many advantages as you can in 2 minutes. SE-2811 Dr. Mark L. Hornick Dr. Yoder
17
Java’s Observer Patterns
4/18/2019 Java’s Observer Patterns Java has multiple implementations of the Observable/Observer pattern java.util: Observable Observer javafx: javafx.scene.control.ButtonBase javafx.event.EventHandler SE-2811 Dr. Mark L. Hornick Dr. Yoder
18
java.util.Observable This “Subject” is a class Advantages:
4/18/2019 java.util.Observable This “Subject” is a class Advantages: Generic implementation (can’t implement in interface) Disadvantages: If you want to inherit from a different class… you can’t Must cast parameter to specific type Don’t get to code from scratch for the learning experience SE-2811 Dr. Mark L. Hornick Dr. Yoder
19
LinearSubject example
[see code example] SE-2811 Dr. Mark L. Hornick
20
UML diagram for the LinearSubject Observer
4/18/2019 UML diagram for the LinearSubject Observer [Circa SE-2811 Dr. Mark L. Hornick Dr. Yoder
21
Implementation Questions
SE-2811 4/18/2019 Implementation Questions What should the arguments of the update method be? Should we send the Subject as the argument? Should each instance of the Observer store the “concrete subject” as a data attribute, or just an Interface reference? Can Subject be an abstract class instead of an Interface? SE-2811 Slide content originally by Dr. Hornick Dr. Yoder
22
Consequences (positive)
4/18/2019 Consequences (positive) Coupling between Subject and Observers: Subject knows it has a list of Observers, but not specific classes Each Observer conforms to the simple interface of the abstract Observer Interface. Hence, coupling is Minimal Abstract SE-2811 Slide content originally by Dr. Hornick Dr. Yoder
23
Consequences (positive)
4/18/2019 Consequences (positive) Cohesion is increased from single-class implementation State management and display/response are separated E.g. GUI innards separated from “your code” E.g. Web access separated from display SE-2811 Slide content originally by Dr. Hornick Dr. Yoder
24
Consequences (negative)
4/18/2019 Consequences (negative) Broadcast communication Notification is broadcast to all interested objects. Observers can be added/removed at any time. Observer decides when it needs to be notified. Unexpected updates Observers have no knowledge Of each other’s presence. About the cost of “state change of subject” Cascade of updates. SE-2811 Slide content originally by Dr. Hornick Dr. Yoder
25
SE-2811 4/18/2019 SE-2811 Dr. Mark L. Hornick Dr. Yoder
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.