Trusted Components. Reuse, Contracts and Patterns. Prof. Dr. Bertrand Meyer Dr. Karine Arnout

Similar documents
Object-Oriented Software Construction

Trusted Components. Reuse, Contracts and Patterns. Prof. Dr. Bertrand Meyer Dr. Karine Arnout

Trusted Components. Reuse, Contracts and Patterns. Prof. Dr. Bertrand Meyer Dr. Karine Arnout

Trusted Components. Reuse, Contracts and Patterns. Prof. Dr. Bertrand Meyer Dr. Karine Arnout

Software Architecture

Lecture 4: Observer Pattern, Event Library and Componentization

Robotics Programming Laboratory

Design Pattern. CMPSC 487 Lecture 10 Topics: Design Patterns: Elements of Reusable Object-Oriented Software (Gamma, et al.)

Object-Oriented Design

From Patterns to Components: The Factory Library Example

Ingegneria del Software Corso di Laurea in Informatica per il Management. Design Patterns part 1

SDC Design patterns GoF

Produced by. Design Patterns. MSc in Communications Software. Eamonn de Leastar

Using Design Patterns in Java Application Development

Design Patterns. Manuel Mastrofini. Systems Engineering and Web Services. University of Rome Tor Vergata June 2011

SYLLABUS CHAPTER - 1 [SOFTWARE REUSE SUCCESS FACTORS] Reuse Driven Software Engineering is a Business

A Eiffel: The Essentials

UNIT I Introduction to Design Patterns

Object Oriented Methods with UML. Introduction to Design Patterns- Lecture 8

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 6: Design Patterns

Design Patterns. Observations. Electrical Engineering Patterns. Mechanical Engineering Patterns

DESIGN PATTERN - INTERVIEW QUESTIONS

Applying the Observer Design Pattern

Tuesday, October 4. Announcements

The Strategy Pattern Design Principle: Design Principle: Design Principle:

Modellistica Medica. Maria Grazia Pia, INFN Genova. Scuola di Specializzazione in Fisica Sanitaria Genova Anno Accademico

MVC. Model-View-Controller. Design Patterns. Certain programs reuse the same basic structure or set of ideas

CS251 Software Engineering Lectures 18: Intro to DP

Object-oriented Software Design Patterns

UNIT I Introduction to Design Patterns

Design Patterns. An introduction

CSCD01 Engineering Large Software Systems. Design Patterns. Joe Bettridge. Winter With thanks to Anya Tafliovich

Slide 1. Design Patterns. Prof. Mirco Tribastone, Ph.D

CS560. Lecture: Design Patterns II Includes slides by E. Gamma et al., 1995

Overview of Patterns: Introduction

Applying Design Patterns to accelerate development of reusable, configurable and portable UVCs. Accellera Systems Initiative 1

Software Design COSC 4353/6353 D R. R A J S I N G H

Design Patterns: Structural and Behavioural

Ingegneria del Software Corso di Laurea in Informatica per il Management. Design Patterns part 1

Introduction to Software Engineering: Object Design I Reuse & Patterns

Robotics Programming Laboratory

Keywords: Abstract Factory, Singleton, Factory Method, Prototype, Builder, Composite, Flyweight, Decorator.

The GoF Design Patterns Reference

Lectures 24 and 25 Introduction to Architectural Styles and Design Patterns

CS/CE 2336 Computer Science II

TDDB84. Lecture 2. fredag 6 september 13

Design Patterns. Gunnar Gotshalks A4-1

Design Patterns Reid Holmes

CSCI Object Oriented Design: Frameworks and Design Patterns George Blankenship. Frameworks and Design George Blankenship 1

Design Patterns. it s about the Observer pattern, the Command pattern, MVC, and some GUI. some more

Patterns. Erich Gamma Richard Helm Ralph Johnson John Vlissides

LECTURE NOTES ON DESIGN PATTERNS MCA III YEAR, V SEMESTER (JNTUA-R09)

INSTITUTE OF AERONAUTICAL ENGINEERING

Software Architecture Bertrand Meyer. Lecture 10: More patterns: Factory, Builder, Singleton. Some design patterns. Some design patterns

Ownership in Design Patterns. Master's Thesis Final Presentation Stefan Nägeli

1 Software Architecture

Modellistica Medica. Maria Grazia Pia, INFN Genova. Scuola di Specializzazione in Fisica Sanitaria Genova Anno Accademico

Object Oriented Paradigm

The Design Patterns Matrix From Analysis to Implementation

Design patterns. Valentina Presutti courtesy of Paolo Ciancarini

Lecture 20: Design Patterns II

Idioms and Design Patterns. Martin Skogevall IDE, Mälardalen University

Design Patterns. Hausi A. Müller University of Victoria. Software Architecture Course Spring 2000

TDDB84: Lecture 09. SOLID, Language design, Summary. fredag 11 oktober 13

Software Engineering I (02161)

WS01/02 - Design Pattern and Software Architecture

Application Architectures, Design Patterns

CSCD01 Engineering Large Software Systems. Design Patterns. Joe Bettridge. Winter With thanks to Anya Tafliovich

COSC 3351 Software Design. Design Patterns Behavioral Patterns (I)

Design Pattern What is a Design Pattern? Design Pattern Elements. Almas Ansari Page 1

Design patterns. Jef De Smedt Beta VZW

CSCI 253. Overview. The Elements of a Design Pattern. George Blankenship 1. Object Oriented Design: Template Method Pattern. George Blankenship

Applying Design Patterns to SCA Implementations

Software Design Patterns. Background 1. Background 2. Jonathan I. Maletic, Ph.D.

Software Reengineering Refactoring To Patterns. Martin Pinzger Delft University of Technology

Bertrand Meyer. Lecture 10: More patterns: Factory,

Object-Oriented Oriented Programming

Software Engineering I (02161)

APPLYING DESIGN PATTERNS TO SCA IMPLEMENTATIONS

CSCI 253. Overview. The Elements of a Design Pattern. George Blankenship 1. Object Oriented Design: Iterator Pattern George Blankenship

Software Development Project. Kazi Masudul Alam

design patterns FOR B.tech (jntu - hyderabad & kakinada) (IV/I - CSE AND IV/II - IT) CONTENTS 1.1 INTRODUCTION TO DESIGN PATTERNS TTERNS... TTERN?...

Brief Note on Design Pattern

Socket attaches to a Ratchet. 2) Bridge Decouple an abstraction from its implementation so that the two can vary independently.

OODP Session 4. Web Page: Visiting Hours: Tuesday 17:00 to 19:00

CS 349 / SE 382 Design Patterns. Professor Michael Terry January 21, 2009

Composite Pattern. IV.4 Structural Pattern

Design Patterns. Manuel Mastrofini. Systems Engineering and Web Services. University of Rome Tor Vergata June 2011

A few important patterns and their connections

Plan. A few important patterns and their connections. Singleton. Singleton: class diagram. Singleton Factory method Facade

1. Quality issues (5 points)

As a programmer, you know how easy it can be to get lost in the details

Analyzing effect of Aspect Oriented concepts in design and implementation of design patterns with case study of Observer Pattern

A Rapid Overview of UML

be used for more than one use case (for instance, for use cases Create User and Delete User, one can have one UserController, instead of two separate

Software Engineering Prof. Rushikesh K.Joshi IIT Bombay Lecture-15 Design Patterns

Produced by. Design Patterns. MSc in Communications Software. Eamonn de Leastar

Topics. Software Process. Agile. Requirements. Basic Design. Modular Design. Design Patterns. Testing. Quality. Refactoring.

Information systems modelling UML and service description languages

v. T_visit (Current) t.accept (v) CLIENT t v The Visitor pattern

Transcription:

1 Last update: 2 November 2004 Trusted Components Reuse, Contracts and Patterns Prof. Dr. Bertrand Meyer Dr. Karine Arnout

2 Lecture 14: Observer, Mediator

Aga for today 3 Observer pattern Event Library Mediator pattern Mediator Library Observer vs. Mediator

Componentizability classification 4 Design pattern 1. Componentizable 2. Non-componentizable 1.1 Built-in Prototype 1.2 Librarysupported 1.3 Newly componentized 1.4 Possible component 2.1 Skeleton 2.2 Possible skeleton 2.3 Some library support 2.4 Design idea Singleton Iterator Facade Interpreter 1.3.1 Fully componentizable Flyweight Observer Mediator Abstract Factory Factory Method Visitor Command Composite Chain of Responsibility 1.3.2 Componentizable but not comprehensive Builder Proxy State 1.3.3 Componentizable but unfaithful Strategy 1.3.4 Componentizable but useless Memento 2.1.1 Method Decorator Adapter 2.1.2 No method Template Method Bridge

Observer pattern 5 Define[s] a one-to-many depency between objects so that when one object changes state, all its depents are notified and updated automatically. [GoF, p 293] * OBSERVER observers * SUBJECT add_observer* update* remove_observer* notify_observers* update+ + MY_OBSERVER subject + MY_SUBJECT add_observer+ remove_observer+ notify_observers+

Class SUBJECT (1/2) 6 deferred class SUBJECT inherit ANY redefine default_create feature {NONE} -- Initialization default_create is -- Initialize observers. do create observers.make feature -- Observer pattern add_observer (an_observer: OBSERVER) is -- Add an_observer to the list of observers. require not_yet_an_observer: not observers.has (an_observer) do observers.ext (an_observer) ensure observer_added: observers.last = an_observer one_more: observers.count = old observers.count + 1

Class SUBJECT (2/2) 7 remove_observer (an_observer: OBSERVER) is -- Remove an_observer from the list of observers. require is_an_observer: observers.has (an_observer) do observers.search (an_observer) observers.remove ensure observer_removed: not observers.has (an_observer) one_less: observers.count = old observers.count 1 notify_observers is -- Notify all observers. (Call update on each observer.) do from observers.start until observers.after loop observers.item.update observers.forth observers: LINKED_LIST [OBSERVER] -- List of observers invariant observers_not_void: observers /= Void

Class OBSERVER 8 deferred class OBSERVER feature -- Observer pattern update is -- Update observer according to the state of -- the subject it is subscribed to. deferred

Book library example (1/4) 9 class LIBRARY inherit SUBJECT redefine default_create feature {NONE} -- Initialization default_create is -- Create and initialize the library with an empty -- list of books. do Precursor {SUBJECT} create books.make

Book library example (2/4) 10 feature -- Access books: LINKED_LIST [BOOKS] -- Books currently in the library feature -- Element change add_book (a_book: BOOK) is -- Add a_book to the list of books and notify all library observers. require a_book_not_void: a_book /= Void not_yet_in_library: not books.has (a_book) do books.ext (a_book) notify_observers ensure one_more: books.count = old books.count + 1 book_added: books.last = a_book... invariant books_not_void: books /= Void no_void_book: not books.has (Void)

Book library example (3/4) 11 class APPLICATION inherit OBSERVER rename update as display_book redefine default_create feature {NONE} -- Initialization default_create is -- Initialize library and subscribe current application as -- library observer. do create library library.add_observer (Current)

Book library example (4/4) 12 feature -- Observer pattern library: LIBRARY -- Subject to observe display_book is -- Display title of last book added to library. do print (library.books.last.title) invariant library_not_void: library /= Void consistent: library.observers.has (Current)

A typical SUBJECT 13 class MY_DATA inherit SUBJECT feature -- Observer pattern add is -- Add Current to data to be observed. do -- Do something. notify_observers remove is do -- Remove Current from data to be observed. -- Do something. notify_observers Redundancy: Hardly maintainable Not reusable

Drawbacks of the Observer 14 The subject knows its observers No information passing from subject to observer when an event occurs (in the pull version) An observer can register to at most one subject (in the pull version) Could pass the SUBJECT as argument to update but would yield many assignment attempts to distinguish between the different SUBJECTs.

Observer in Java 15 In java.util, interface Observer and class Observable Rarely used for lack of multiple inheritance (subjects must inherit from Observable) Common scheme (e.g. Java Swing, AWT): event-based implementation Subjects define the registration methods: void addxxxlistener (XxxListener l) void removexxxlistener (XxxListener l) Whenever a property being observed changes, the subject iterates over its listeners and calls the method defined by the XxxListener interface

Observer in Smalltalk 16 Smalltalk supports the Observer pattern in the kernel library: class Object, shared by all objects, has messages (features) for both observer and subject objects. update: anaspectsymbol update: anaspectsymbol with: aparameter update: anaspectsymbol with: aparameter from: aser // Receive an update message from a Model (Subject). changed changed: anaspectsymbol changed: anaspectsymbol with: aparameter // Receiver changed. adddepent: anobject removedepent: anobject depents // Return collection of all depents.

Aga for today 17 Observer pattern Event Library Mediator pattern Mediator Library Observer vs. Mediator

Event Library 18 Basically: One generic class: EVENT_TYPE Two features: publish and subscribe For example: A button my_button that reacts in a way defined in my_procedure when clicked (event mouse_click):

Example using the Event Library 19 The publisher ( subject ) creates an event type object: mouse_click: EVENT_TYPE [TUPLE [INTEGER, INTEGER]] is -- Mouse click event type once create Result ensure mouse_click_not_void: Result /= Void The publisher triggers the event: mouse_click.publish ([x_positition, y_position]) The subscribers ( observers ) subscribe to events: my_button.mouse_click.subscribe (agent my_procedure)

Subscriber variants 20 click.subscribe (agent my_procedure) my_button.click.subscribe (agent my_procedure) click.subscribe (agent your_procedure (a,?,?, b)) click.subscribe (agent other_object.other_procedure)

Publisher, subscriber, subscribed object (1/2) 21 Publisher: Responsible for triggering ( publishing ) events. (Corresponds to the subject of the Observer pattern.) Subscribed object: Notified whenever an event (of the event type they are subscribed to) is published. (Corresponds to the observer of the Observer pattern.) Subscriber: Registers subscribed objects to a given event type. (Corresponds to the class, which registers the observers to the subjects.)

Publisher, subscriber, subscribed object (2/2) 22 Subscribed objects Publishers Subscriber (APPLICATION) Subscribes objects to events

Book library example with the Event Library (1/2) 23 class LIBRARY feature -- Access books: LINKED_LIST [BOOK] -- Books in library feature -- Event type book_event: EVENT_TYPE [TUPLE [BOOK]] -- Event associated with attribute books

Book library example with the Event Library (2/2) 24 feature -- Element change add_book (a_book: BOOK) is -- Add a_book to the list of books and -- publish book_event. require a_book_not_void: a_book /= Void not_yet_in_library: not books.has (a_book) do books.ext (a_book) book_event.publish ([a_book]) ensure one_more: books.count = old books.count + 1 book_added: books.last = a_book invariant books_not_void: books /= Void book_event_not_void: book_event /= Void

Observer pattern vs. Event Library 25 In case of an existing class MY_CLASS: With the Observer pattern: Need to write a descant of OBSERVER and MY_CLASS Useless multiplication of classes With the Event Library: Can reuse the existing routines directly as agents E.g. EiffelVision vs. EiffelVision2

Observer: Componentization outcome 26 Completeness All cases of the Observer pattern (and more) Usefulness Easy-to-use, extible Event-driven programming Already used in practice (JMLC paper, ESDL) Faithfulness Agents instead of inheritance Type-safety Type-safe (constrained genericity, agents) Performance Same order as the Observer pattern Exted applicability Event-driven programming in general

Aga for today 27 Observer pattern Event Library Mediator pattern Mediator Library Observer vs. Mediator

Componentizability classification 28 Design pattern 1. Componentizable 2. Non-componentizable 1.1 Built-in Prototype 1.2 Librarysupported 1.3 Newly componentized 1.4 Possible component 2.1 Skeleton 2.2 Possible skeleton 2.3 Some library support 2.4 Design idea Singleton Iterator Facade Interpreter 1.3.1 Fully componentizable Flyweight Observer Mediator Abstract Factory Factory Method Visitor Command Composite Chain of Responsibility 1.3.2 Componentizable but not comprehensive Builder Proxy State 1.3.3 Componentizable but unfaithful Strategy 1.3.4 Componentizable but useless Memento 2.1.1 Method Decorator Adapter 2.1.2 No method Template Method Bridge

Mediator pattern 29 Define[s] an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction indepently. [GoF, p 273] MEDIATOR Anarchy style Monarchy style S and receive requests

Mediator pattern 30 * MEDIATOR update_colleagues mediator * notify_mediator + MY_MEDIATOR colleague_1 + _1 + _2 colleague_2

Class MY_MEDIATOR (1/2) 31 class MY_MEDIATOR inherit MEDIATOR create make feature {NONE} -- Initialization make is -- Create colleague_1 and colleague_2. do create colleague_1.make (Current) create colleague_2.make (Current) feature -- Access colleague_1: _1 -- First colleague of mediator colleague_2: _2 -- Second colleague of mediator

Class MY_MEDIATOR (2/2) 32 feature -- Basic operations update_colleagues (a_colleague: ) is -- Update colleagues because a_colleague changed. do if a_colleague = colleague_1 then colleague_2.do_something_2 elseif a_colleague = colleague_2 then colleague_1.do_something_1 else -- Colleague not known invariant colleague_1_not_void: colleague_1 /= Void colleague_2_not_void: colleague_2 /= Void

Class (1/2) 33 deferred class feature {NONE} -- Initialization make (a_mediator: like mediator) is -- Set mediator to a_mediator. require a_mediator_not_void: a_mediator /= Void do mediator := a_mediator ensure mediator_set: mediator = a_mediator feature -- Access mediator: MEDIATOR -- Mediator

Class (2/2) 34 feature -- Mediator pattern notify_mediator is -- Notify mediator that Current has changed. do mediator.update_colleagues (Current) invariant mediator_not_void: mediator /= Void

Class _1 35 class _1 inherit create make feature -- Basic operations change_1 is -- Change something on Current. do -- Do something that changes Current's state. notify_mediator Similar to the Observer pattern do_something_1 is -- Do something. do Event Library

Original Mediator pattern 36 * MEDIATOR update_colleagues mediator * notify_mediator + MY_MEDIATOR colleague_1 + _1 + _2 colleague_2

Mediator pattern with the Event Library 37 mediator + MEDIATOR mediator * colleague_1 MY_MEDIATOR + _1 + _2 colleague_2 event_1 event_library EVENT_TYPE [EVENT_DATA -> TUPLE] event_2

Class _1 38 class _1 inherit feature -- Basic operations change_1 is -- Change something on Current. do -- Do something that changes Current's state. event_1.publish ([])

Class MEDIATOR 39 class MEDIATOR create make feature {NONE} -- Initialization make is -- Create colleague_1 and colleague_2. do create colleague_1.make (Current) create colleague_2.make (Current) colleague_1.event_1.subscribe ( agent colleague_2.do_something_2) colleague_2.event_2.subscribe ( agent colleague_1.do_something_1)

Aga for today 40 Observer pattern Event Library Mediator pattern Mediator Library Observer vs. Mediator

Mediator Library (1/4) 41 class interface MEDIATOR [G > ] create make -- Initialize colleagues. feature -- Access colleagues: LINKED_LIST [G] -- Colleagues of mediator feature -- Element change ext (a_colleague: G) -- Ext colleagues with a_colleague. -- Update event subscription of colleagues. require a_colleague_not_void: a_colleague /= Void not_a_colleague: not colleagues.has (a_colleague) ensure one_more: colleagues.count = old colleagues.count + 1 is_last: colleagues.last = a_colleague subscribed: colleagues.for_all (agent is_colleague_subscribed)

Mediator Library (2/4) 42 remove (a_colleague: G) is -- Remove a_colleague from colleagues. -- Update event subscription of remaining colleagues. require a_colleague_not_void: a_colleague /= Void has_colleague: colleagues.has (a_colleague) ensure one_less: colleagues.count = old colleagues.count 1 not_has_colleague: not colleagues.has (a_colleague) unsubscribed: a_colleague.unsubscribed invariant colleagues_not_void: colleagues /= Void no_void_colleague: not colleagues.has (Void)

Mediator Library (3/4) 43 deferred class interface feature {NONE} -- Initialization make (a_mediator: like mediator) is -- Set mediator to a_mediator. require a_mediator_not_void: a_mediator /= Void ensure mediator_set: mediator = a_mediator feature -- Access mediator: MEDIATOR [] -- Mediator event: EVENT_TYPE [TUPLE] -- Event

Mediator Library (4/4) 44 feature -- Basic operations change is -- Do something that changes current colleague's -- state. do do_change event.publish ([]) invariant mediator_not_void: mediator /= Void event_not_void: event /= Void

Book library example with the Mediator Library (1/2) 45 class USER inherit create make feature -- Status report may_borrow: BOOLEAN -- May user borrow books from the library? feature -- Element change do_something is -- Set may_borrow to False. do may_borrow := False ensure then may_not_borrow: not may_borrow

Book library example with the Mediator Library (2/2) 46 feature {NONE} -- Implementation do_change is -- Borrow a book from the library. do if may_borrow then -- Borrow a book from the library.

Mediator: Componentization outcome 47 Completeness All cases of the Mediator pattern Usefulness Reusable Easy-to-use (Event Library) Faithfulness Different from a traditional implementation of Mediator Similar to an implementation of Mediator using the Event Library (with genericity) Type-safety Type-safe (constrained genericity, agents) Performance Same order as the Mediator pattern Exted applicability No more cases

Aga for today 48 Observer pattern Event Library Mediator pattern Mediator Library Observer vs. Mediator

Mediator Library vs. Event Library (1/3) 49 Mediator pattern: Every colleague observes all other colleagues A particular use of the Event Library Mediator Library: Removes from clients the burden of (un)registering colleagues when a new colleague is added (removed) Moved to the MEDIATOR Mediator Library encapsulates a common use of the Event Library to facilitate the programmers job. It relies on the Event Library.

Mediator Library vs. Event Library (2/3) 50 With the Event Library: CLIENT

Mediator Library vs. Event Library (3/3) 51 With the Mediator Library: CLIENT MEDIATOR

Complementary material 52 From Patterns to Components: Chapter 7: Observer and Mediator About the Event Library and Event-Driven programming: http://se.inf.ethz.ch/people/arnout/publications/arslan_ni enaltowski_arnout_jmlc_2003_event_library.pdf http://www.inf.ethz.ch/~meyer/ongoing/events.pdf Further reading: Erich Gamma: Design Patterns, Addison-Wesley, 1995. (Observer, p 293-304; Mediator, p 283-292) David Geary. An inside view of Observer, JavaWorld, 2003. http://www.javaworld.com/javaworld/jw-03-2003/jw-0328-designpatterns.html

53 End of lecture 14