1 / 20

The Strategy Pattern

The Strategy Pattern. Review. What problems are we trying to avoid? What do we want to achieve?. A different approach: Isolate behaviors that vary, and encapsulate them as attributes to eliminate implementation inheritance and class explosions:. SimUDuck v5. Consider Collections.sort().

taylor
Télécharger la présentation

The Strategy Pattern

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. The Strategy Pattern SE-2811 Dr. Mark L. Hornick

  2. Review What problems are we trying to avoid? What do we want to achieve? SE-2811 Dr. Mark L. Hornick

  3. A different approach: Isolate behaviors that vary, and encapsulate them as attributes to eliminate implementation inheritance and class explosions: SE-2811 Dr. Mark L. Hornick SimUDuck v5

  4. Consider Collections.sort() Collections.sort() implements an argument which is a reference to a concrete class that implements the Comparator interface, and thus the behavior of the compare() method. Depending on the strategy of the compare() method in the concrete class, different sorting will be used by Collections.sort(). The comparison strategy is decoupled from the Collections.sort() method itself. SE-2811 Dr. Mark L. Hornick

  5. Another sorting example • Different strategies for sorting • MergeSort O(NlogN) • QuickSort O(NlogN) • ShellSort In-place, Ω(N(logN/log logN)2) • InsertionSort O(N2) • BubbleSort O(N2) • Cool sorting algorithms of the future (or past) … • Would be nice to “plug in” new strategies SE-2811 Dr. Josiah Yoder Idea: http://fuchangmiao.blogspot.com/2007/10/strategy-vs-observer.html

  6. The Strategy Design Patternin its general form: The Context is the class that encapsulates and usesa specific behavior, or Strategy. A Strategy is an interfacethat defines a behavior ConcreteStrategy classes implement specific behaviors

  7. Applying the Strategy Pattern: Evidence 1 The Strategy Pattern is a behavioral pattern usually considered and applied at design-time. Premise: Your application requires similar objects whose behavior varies. SE-2811 Dr. Mark L. Hornick

  8. Applying the Strategy Pattern: Evidence 2 As a designer, you watch for inheritance patterns that result in excessive behavior overrides and/or code duplication among classes. SE-2811 Dr. Mark L. Hornick

  9. Applying the Strategy Pattern: Action! Leave behavior that is truly shared in abstract classes. Isolate behavior(s) that vary and declare interfaces that define those behaviors Implement the behaviors in separate concrete classes whose references can be passed to the Duck ctor SE-2811 Dr. Mark L. Hornick

  10. Creating Ducks with specific behaviors // create some behaviors SwimBehaviorcsb = new CircularSwimming(); QuackBehaviorsqb = new StandardQuacking(); SwimBehaviorrsb = new RandomFloating(); // daffy has circular swimming, std quacking Waterfowl daffy = new Duck(“daffy”, csb, sqb); // donald has random floating, std quacking Waterfowl donald = new Duck(“donald”, rsb, sqb); daffy.swim(); donald.quack(); SE-2811 Dr. Mark L. Hornick

  11. Inside a Duck class // constructor public void Duck(String name, SwimBehaviorsb, QuackBehaviorqb) { super(name, sb, qb) } SE-2811 Dr. Mark L. Hornick

  12. Inside a Waterfowl class public abstract class Waterfowl { private SwimBehaviorswimBehavior; private QuackBehaviorquackBehavior; private String name; // constructor public void Waterfowl(String name, SwimBehaviorsb, QuackBehaviorqb) { this.name = name; swimBehavior = sb; quackBehavior = qb; } // centralize implementation of behaviors in top-level classes // if possible; avoid duplication of behavior in subclasses. // Note we can make this method final to prevent subclasses from overriding it! public void swim() { swimBehavior.swim(); // invoke the specific behavior } ... SE-2811 Dr. Mark L. Hornick

  13. Strategy is a Behavioral Design Pattern The Strategy pattern allows for selection of specific behavioral algorithms at runtime, since the selected strategy is just an attribute of the class using the Strategy. • We can select particular behavioral strategies when we constructed the Ducks • But since the swim() or quack() behaviors of Duck are just attributes (references) to concrete Strategy classes, we could easily change the behaviors at any time with a simple setSwimBehavior() mutator method!

  14. The Strategy pattern favors Encapsulation over Extension • That is, rather than changing the behavior implemented within a derived class by extending from a parent/base class, we encapsulate behaviors into a class as instance attributes, which can be varied. • The Strategy pattern lets us vary and change behavioral algorithms independently of the clients that use the behaviors.

  15. A good Design Pattern has also solved a larger conceptual issue: To make a program easy to maintain, we always want to strive for • High cohesion • Low coupling SE-2811 Dr. Mark L. Hornick

  16. Coupling: How closely two or more classes are related Does changing code in one class require changes in another class?? • If “yes”, then it has high coupling (bad) • Changing swim or quack behaviors does not require changes to the Duck class (low coupling) Cohesion (?) -- Grouping similar functionality in a single place in the code -- Few behavior in a class -- Each class should have one focus SE-2811 Dr. Mark L. Hornick

  17. Other design principles benefitting from the Strategy Pattern • Decreases coupling, increases cohesion • The behavior of the Duck is not coupled to the Duck – behaviors are implemented separately. • Like all Design Patterns, the Strategy pattern allows us to vary a part of the system (swim and quack behavior) independently of other parts

  18. Other good design principles we visited • Code to the highest level of abstraction that is possible in a given context: • ArrayList<Thing> = new ArrayList<Thing> // bad • List<Thing> = new ArrayList<Thing> // good • Collection<Thing> = new ArrayList<Thing> // better

  19. Other good design principles we visited • Code to most restrictive level of access modification that is possible in a given context: • Use public for constants and methods; never for attributes. On methods: only on those you want to support for public consumption • Use /*package*/ if cooperating classes in the same package need access to attributes or special methods • Use protected to allow derived classes in any package access to members • Use private to completely guard members from view outside the defining class

  20. Are there disadvantages? • Yes: the implementation of the Strategy Pattern is somewhat more sophisticated than using simple inheritance • All design patterns usually exhibit this type of tradeoff. SE-2811 Dr. Mark L. Hornick

More Related