21
02 - Behavioral Design Patterns – 2 Moshe Fresko Bar-Ilan University חחח"ח2008

02 - Behavioral Design Patterns – 2

  • Upload
    hanh

  • View
    17

  • Download
    0

Embed Size (px)

DESCRIPTION

02 - Behavioral Design Patterns – 2. Moshe Fresko Bar-Ilan University תשס"ח 2008. Strategy. Moshe Fresko Bar-Ilan University תשס"ו - 2005-2006 Design Patterns Course. Strategy. Intent - PowerPoint PPT Presentation

Citation preview

Page 1: 02 - Behavioral  Design Patterns – 2

02 - Behavioral Design Patterns – 2

Moshe Fresko

Bar-Ilan University

תשס"ח

2008

Page 2: 02 - Behavioral  Design Patterns – 2

Strategy

Moshe Fresko

Bar-Ilan University

2005-2006 - תשס"ו

Design Patterns Course

Page 3: 02 - Behavioral  Design Patterns – 2

Strategy Intent

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

Motivation Many algorithms exist for breaking a stream of text into

lines. Hard-coding them in client isn’t desirable since: Clients become more complex Non-used algorithms will be supported Difficult to add new algorithms

We can avoid these problems by encapsulating different line-breaking algorithms in different classes.

Each of these classes are called a strategy.

Page 4: 02 - Behavioral  Design Patterns – 2

Strategy - Motivation

Page 5: 02 - Behavioral  Design Patterns – 2

Strategy – Applicability

Use Strategy pattern whenMany different classes differ only in their

behavior. You need different variants of an algorithm.An algorithm uses data that clients

shouldn’t know about.A class uses multiple conditional

statements.

Page 6: 02 - Behavioral  Design Patterns – 2

Strategy – General Structure

Page 7: 02 - Behavioral  Design Patterns – 2

Strategy – Participants Strategy

Declares an interface to all supported algorithms

ConcreteStrategy Implements the algorithm using the Strategy interface

Context Is configured with a ConcreteStrategy object Maintains a reference to a Strategy object May define an interface that lets the Strategy access

its data.

Page 8: 02 - Behavioral  Design Patterns – 2

Strategy Collaborations

Strategy and Context interact to implement the chosen Algorithm. Context may pass all data required to Strategy or alternatively it can pass a reference to itself.

Clients usually create and pass a ConcreteStrategy object to the context, from a family of ConcreteStrategy objects.

Consequences Families of related algorithsm. An alternative to subclassing Context. Strategies eliminate conditional statements. A choice of implementations. Time and space trade-offs. Clients must be aware of different strategies. Communication overhead between Strategy and Context. Increased number of objects. They may be shared.

Page 9: 02 - Behavioral  Design Patterns – 2

Strategy – Implentation Issues

Implementation

Defining the Strategy and Context interfaces Context can pass data in parameters to Strategy (better decoupling) Context can pass itself as an argument to Strategy Strategy can keep Context

Strategies as Template parameters In C++ templates can be used to configure a class with a strategy.template<class Iterator> void sort(Iterator _First, Iterator _Last ); template<class Iterator, class Pr> void sort(Iterator _First, Iterator _Last, Pr _Comp );

Making Strategy objects optional

Page 10: 02 - Behavioral  Design Patterns – 2

Strategy – Sample Codeimport java.util.* ;class A { public final int i ;

A(int i) { this.i = i ; } }class Ascending implements Comparator {

public int compare(Object o1, Object o2) { A a1=(A)o1, a2=(A)o2 ; if (a1.i<a2.i) return -1 ; if (a1.i>a2.i) return +1 ; return 0 ; }

}class Descending implements Comparator {

public int compare(Object o1, Object o2) { A a1=(A)o1, a2=(A)o2 ; if (a1.i<a2.i) return +1 ; if (a1.i>a2.i) return -1 ; return 0 ; }

}

Page 11: 02 - Behavioral  Design Patterns – 2

Strategy – Sample Codepublic class S {

public static void main(String[] args) {A[] asc = { new A(1), new A(5), new A(3), new A(2) } ;A[] dsc = (A[]) asc.clone() ;Arrays.sort(asc,new Ascending()) ;Arrays.sort(dsc,new Descending()) ;System.out.println("Ascending : "+arrStr(asc)) ;System.out.println("Descending: "+arrStr(dsc)) ;

}static String arrStr(A[] a) {

String s = "[" + a[0].i ; for (int i=1;i<a.length;++i)

s += ","+a[i].i ; s+="]" ; return s ;

}}// Output : Ascending : [1,2,3,5]// Descending: [5,3,2,1]

Page 12: 02 - Behavioral  Design Patterns – 2

Strategy – Examples class TreeSet

CTOR: TreeSet () : Default comparator. Contained objects must implement Comparable interface

CTOR: TreeSet (Comparator)

class JPanel CTOR: JPanel () : With default layout manager CTOR: JPanel ( LayoutManager )

C++ STL: class maptemplate < class Key, class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> > > class map { … }

Page 13: 02 - Behavioral  Design Patterns – 2

Observer

Moshe Fresko

Bar-Ilan University

2005-2006 - תשס"ו

Design Patterns Course

Page 14: 02 - Behavioral  Design Patterns – 2

Observer Intent

Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updates automatically.

Motivation Many UI toolkits separate presentation from application data.

Classes defining presentation and data can be reused independently.

Spreadsheet object and bar-chart object can depict information in the same application data.

They must be notified of any data change. The Observer defines how to establish this relationship between

“Subject” and “Observer”. The interaction is called “Publish-Subscribe”

Page 15: 02 - Behavioral  Design Patterns – 2

Observer - Motivation

Page 16: 02 - Behavioral  Design Patterns – 2

Observer – Applicability Use Observer pattern when

An abstraction has two aspects, one dependent on the other and encapsulating these aspects in different objects lets you vary and reuse them independently.

A change in an object requires changes on others and you don’t know how many objects to be changed.

An object should be able to notify others without knowing them.

Page 17: 02 - Behavioral  Design Patterns – 2

Observer – General Structure

Page 18: 02 - Behavioral  Design Patterns – 2

Observer – Participants Subject

Knows its observers. Observer

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

ConcreteObject Stores state of interest to ConcreteObserver objects. Sends a notification to its Observers when its state changes.

ConcreteObserver Maintains a reference to ConcreteSubject Store state that should be consistent with the subject’s. Implements the Observer updating interface to keep its state

consistent.

Page 19: 02 - Behavioral  Design Patterns – 2

Observer Collaborations

ConcreteSubject notifies its observers whenever a change occurs that could make its observers' state inconsistent with its own

After being informed of a change in the concrete subject, a ConcreteObserver object may query the subject for information.

Page 20: 02 - Behavioral  Design Patterns – 2

Observer

Consequences

Abstract coupling between Subject and Observer

Support for broadcast communication

Unexpected updates

Page 21: 02 - Behavioral  Design Patterns – 2

Observer – Implementation Mapping subjects to their observers Observing more then one subject Who triggers the update?

Subject Client

Dangling references to deleted Subjects. Making sure Subject state is self-consistent. Avoiding observer-specific update protocols.

Push model Pull model

Specifying modifications of interest explicitly.