220 likes | 339 Vues
This document provides a comprehensive overview of the Strategy Design Pattern, a foundational concept in behavioral design patterns. The Strategy encapsulates a family of algorithms, allowing them to vary independently from the clients that use them. The motivation for this pattern centers around the issues of complexity and flexibility when implementing various algorithms for tasks, such as breaking text into lines. The document also discusses the general structure of the Strategy pattern, its applicability, collaboration between Strategy and Context, and potential implementation issues, supported by sample code in Java.
E N D
02 - Behavioral Design Patterns – 2 Moshe Fresko Bar-Ilan University תשס"ח 2008
Strategy Moshe Fresko Bar-Ilan University תשס"ו - 2005-2006 Design Patterns Course
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.
Strategy – Applicability • Use Strategy pattern when • Many 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.
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.
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.
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
Strategy – Sample Code import 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 ; } }
Strategy – Sample Code public 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]
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 map template < class Key, class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> > > class map { … }
Observer Moshe Fresko Bar-Ilan University תשס"ו - 2005-2006 Design Patterns Course
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”
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.
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.
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.
Observer • Consequences • Abstract coupling between Subject and Observer • Support for broadcast communication • Unexpected updates
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.