Presentation is loading. Please wait.

Presentation is loading. Please wait.

The Strategy Pattern CSC 211: Design Patterns. Reading Quiz.

Similar presentations


Presentation on theme: "The Strategy Pattern CSC 211: Design Patterns. Reading Quiz."— Presentation transcript:

1 The Strategy Pattern CSC 211: Design Patterns

2 Reading Quiz

3 Video Game Example Aliens vs. Humans Both have adjustable life points Both take damage Both can recover life points Let’s design a class… Some functionality is shared, so inheriting from a common superclass makes sense We’ll differentiate between the two classes in their subclasses

4 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Class name Class variables Class methods

5 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int > = constructor What does Human inherit from LifeForm? What does Human add to extend its superclass? extends

6 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien > Alien() So we’re all set … at least for handling life points, right?

7 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien > Alien() Design change! Characters allowed to recover life points over time

8 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void recover(i : int) : void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien > Alien() New Problem: Now Humans have a double advantage (armor + recovery)

9 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien > Alien() recover(i : int) : void Another Design Change: Some aliens should be harder than others They should recover at different rates, not all at once

10 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien maxLifePoints : int > Alien() recoverNone(i : int) : void recoverFraction(percent : double) void recoverLinear(i : int) : void Possible Solution: Multiple methods Problems with this?

11 Design Principle #1 You will spend more time maintaining your code than you will on the initial design. Plan for change! Identify the aspects of your application that vary and separate them from what stays the same

12 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien maxLifePoints : int > Alien() recoverNone(i : int) : void recoverFraction(percent : double) void recoverLinear(i : int) : void Create an interface for the things that vary

13 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien maxLifePoints : int > Alien() Create an interface for the things that vary RecoveryBehavior calculateRecovery(current : int,max : int) : int >

14 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien maxLifePoints : int > Alien() Create an interface for the things that vary Create behavior classes that implement the interface RecoveryBehavior calculateRecovery(current : int,max : int) : int >

15 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien maxLifePoints : int > Alien() > RecoveryBehavior calculateRecovery(current : int,max : int) : int RecoveryLinear step : int > RecoveryLinear(rStep : int) calculateRecovery(current : int, max : int) : int implements RecoveryNone > RecoveryNone() calculateRecovery(current : int, max : int) : int RecoveryFractional percent : double > RecoveryFractional(rPercent : double) calculateRecovery(current : int, max : int) : int

16 Design Principle #2 Exploit polymorphism in useful ways. You can only inherit from one superclass Program to an interface, not an implementation

17 LifeForm currentLifePoints : int getLifePoints() : int takeHit(i : int): void Human armorPoints : int > Human(life : int,armor : int) setArmorPoints(armor : int) : void getArmorPoints() : int Alien recoveryBehavior : RecoveryBehavior maxLifePoints : int > Alien() recover() : void setCurrentLifePoints(i : int) : void > RecoveryBehavior calculateRecovery(current : int,max : int) : int RecoveryLinear step : int > RecoveryLinear(rStep : int) calculateRecovery(current : int, max : int) : int RecoveryFractional percent : double > RecoveryFractional(rPercent : double) calculateRecovery(current : int, max : int) : int RecoveryNone > RecoveryNone() calculateRecovery(current : int, max : int) : int Has-A

18 Design Principle #3 Avoid inheriting behavior Favors flexibility Favor composition over inheritance

19 The Strategy Pattern SuperClass Behavior myBehavior methodA() methodB() SubClassA methodA() > > Behavior behaviorMethod() Behavior_v1 behaviorMethod() SubClassB Behavior_v2 behaviorMethod() IS-A HAS-A Implements (also IS-A)

20 The Strategy Pattern Definition The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.

21 Lab 2 Due Monday Submit your code and tests electronically Header the at top of every file you write /** * Description of this class * @author Your Full Name * Your section number */ ProjectName_LastName Zip you eclipse project, name your zip file »LastName_Lab#


Download ppt "The Strategy Pattern CSC 211: Design Patterns. Reading Quiz."

Similar presentations


Ads by Google