Presentation is loading. Please wait.

Presentation is loading. Please wait.

Observer, Strategy, Decorator, Prototype,. Observer Pattern Dependence mechanism / publish-subscribe / event handler / constraints / broadcast Let objects.

Similar presentations


Presentation on theme: "Observer, Strategy, Decorator, Prototype,. Observer Pattern Dependence mechanism / publish-subscribe / event handler / constraints / broadcast Let objects."— Presentation transcript:

1 Observer, Strategy, Decorator, Prototype,

2 Observer Pattern Dependence mechanism / publish-subscribe / event handler / constraints / broadcast Let objects propagate information without depending on each other much. Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

3 Observer Pattern Observerupdate: Subject addDependent: removeDependent: changed: ValueHoldervalue:valueTextViewupdate: observer/dependent model

4 Observer Pattern: Registration subject addDependent: observer Notification self changed. self changed: #value Update define update: aSymbol

5 Notification Object notifies dependents when information changes by sending itself a #changed message. changed: anArg self dependents do: [:each | each update: anArg]

6 Problem A man and dog are in the room. When the dog wants to go out, he barks. When the man hears the dog barking, he opens the door. When the dog wants to go out and the door is open, he leaves.

7 Basic classes Dog bark / move Person Door open / close / isOpen Object addDependent: changed: update:

8 Collaborations PersonDoor open close Dog bark listen watch

9 Dynamic Model Record order of events, interaction between objects. Dog Person Door Sequence diagram bark open notify go thru door notify close register register unregister notify

10 A Script | person door dog | door := Door new close. dog := Dog new. dog door: door. person := Person new. person door: door; dog: dog. dog bark.

11 Door opened open opened := true. self changed: #open

12 Door close opened := false. self changed: #close isOpen ^opened

13 Dog currentState :: #sleeping, #waiting, #outside bark currentState := #waiting. self changed: #bark door: aDoor door := aDoor. door addDependent: self

14 Dog goOut currentState := #outside. door removeDependent: self. self changed: #move

15 Dog update: aSymbol (currentState == #waiting) & (aSymbol == #open) ifTrue: [self goOut ]

16 Person dog: aDog dog := aDog. dog addDependent: self

17 Person update: aSymbol aSymbol == #bark ifTrue: [door open]. aSymbol == #move ifTrue: [door close]

18 Watcher instance variable: name update: aSymbol Transcript show: subjectName; show: ' '; show: aSymbol; cr name: aString name := aString

19 | person door dog | door := Door new close. door addDependent: (Watcher new name: 'door'). dog := Dog new. door addDependent: dog. dog addDependent: (Watcher new name: 'Fido'). person := Person new. person door: door; dog: dog. dog bark.

20 Improvements Creating method (have class method return initialized object) Compose method (Watcher on: door name: 'door') (door watcherNamed: 'door')

21 Model and Memory Management Dog allInstances reports a lot of dogs! Garbage collection doesn't help. Object uses a global dictionary to store dependents. Subject must "release" its observers/dependents.

22 Make Dog a subclass of Model Model uses an instance variable to store dependents. It does not have to release its observers. Subclasses of Model cause less problems with garbage collection. Class that has dependents should be subclass of Model.

23 If you are not using Model then after the script says dog bark. add the messages dog release. door release. person release

24 Advantage of Observer Pattern Easy to add new observers. Coupling between observer and subject is abstract.

25 Disadvantage of Observer Pattern Often hard to understand relationships between objects in system. Sometimes inefficient.

26 Adding New Observer Suppose room also has a bird, which is usually in a cage. If bird is not in cage and door opens, bird flies out.

27 Bird update: aSymbol (aSymbol == #open) & (self isCaged not) ifTrue: [self flyOut] Script must now create a bird and make it depend on the door.

28 Summary Observer is an important pattern Used in a UI to make reusable components Reduces coupling by increasing abstraction Abstraction makes programs easier to change, harder to understand Often requires a “script” to set up dependencies


Download ppt "Observer, Strategy, Decorator, Prototype,. Observer Pattern Dependence mechanism / publish-subscribe / event handler / constraints / broadcast Let objects."

Similar presentations


Ads by Google