cs441-f10-chap9-10.ppt
Download
Report
Transcript cs441-f10-chap9-10.ppt
CS 4240: More Design Patterns
Readings:
Chap. 9
Let’s Recap Some Ideas and
Strategies
We’ll assume some design-planning is
useful up-front
Design with change in mind
Change will happen
Not sure exactly what it will be
Can predict in advance where it’s likely to
happen
Strategies in Response to This
In anticipation of change, consider doing
this:
Program to an interface not an implementation
Favor aggregation over inheritance
Encapsulate things that will vary
Even if you’re not quite sure how they may vary
Often Logic Varies
Read textbook pp. 142-152
Example: calculating sales tax
A SalesOrder object-instance must know how
to calculate tax for itself
Rules vary by country
Rules change
New countries/rules may be added
Strategy Pattern
The idea:
When choice of an algorithm is a dimension of
variability among a family of similar things
Hide this behind an interface
The client codes to this interface
This object is usually aggregated with another
object
This pairing must be established before use
Is this Common?
You’ve seen the Java Comparator interface
Business rules
University registration system
Student Bob wants to register for CS3205
Allowed or not? selectedCourse.allowReg(aStudent)
Lots of logic here.
Varies by course.
Varies by student (on probation? too many credits?)
Changes over time.
Strategy Pattern Description, part 1
Intent: Enables you to use different business
rules or algorithms depending on the context in
which they occur.
Problem:
The selection of an algorithm that
needs to be applied depends on the client
making the request or the data being acted on. If
you just have a rule in place that does not
change, you do not need a Strategy pattern.
Solution:
Separates the selection of
algorithm from the implementation of the
algorithm. Allows for the selection to be made
based upon context.
Strategy Pattern Description, part 2
Strategy Pattern Description, part 3
Participants and collaborators:
Strategy specifies common interface for the algorithms.
ConcreteStrategies implement these different
algorithms.
Context linked to a specific ConcreteStrategy with a
reference of type Strategy.
Strategy and Context interact to implement the chosen
algorithm.
Context forwards requests from its client to Strategy.
Sometimes Strategy must query Context.
Strategy Pattern Description, part 4
Consequences:
The Strategy pattern defines a family of algorithms.
Switches and/or conditionals can be eliminated.
This might improve run-time efficiency!
You must invoke all algorithms in the same way. (They
must all have the same interface.)
The interaction between the Concrete Strategies and
the Context may require the addition of methods that get
state to the Context.
Strategy Pattern Description, part 5
Implentation notes, etc.
Client responsible for linking a Context object with a
particular ConcreteStrategy
This means Client must “understand” what strategies are
there. So some coupling but at a higher level.
Note this link is dynamic -- could change
If inheritance used to define a “SubContext” class, it’s
fixed
Optional Strategy makes sense?
Allow for Context to have null for its reference to Strategy
• So must check first before calling
• If null, Context has default behavior coded in Context
Think About and Discuss
Are State and Strategy DPs similar? The
same?
How different?
Suggestion: look up Web resources to
learn more.
Strategy Examples
Java comparator objects?
Collections.sort(theList, new MyComparator());
How does this match the pattern? How not?
java.util.zip
Two classes need an algorithm for
calculating check-sums
CheckedInputStream, CheckedOutputStream
Two algorithms defined that meet
CheckSum interface
Adler32 and CRC32
Constructors for first two classes get an
instance of Checksum
java.util.zip and Checksum interface
Interface Checksum:
long getValue() : Returns the current checksum value.
void reset() : Resets the checksum to its initial value.
void update(byte[] b, int off, int len) : Updates the current checksum with
the specified array of bytes.
void update(int b) : Updates the current checksum with the specified byte.
Other Examples
Input field validation in GUIs
Valid type, range, values, etc.
A Validate interface hides algorithm/logic used
Each input-field linked to a Validate instance
All fields told to validate() their contents
Memory allocation (a la C/C++)
Get memory chunks, return chunks
But could involve memory-pools, caches, locks,
other management
Note:
Again, here’s class that more like an
operation than a “thing” or entity
END