Design Patterns Slide 1

advertisement
Design Patterns
Slide 1
Video Rental System
VideoDescription
barCode
title
type
……..
Member
name
address
phoneNumber
creditCard#
emailAddress
userName
password
•
•
•
•
•
Rental
rentalStore
rentalDate
1
dueDate
*
request
returnDate
returnTime
1
*
*
1
rents
Rental of each movie is determined by the type.
There are currently in the system three types of movies
New releases have a rental fee of $3.00
Children’s movies rent for $1.00
All other movies rent for $2.00
*
VideoCopy
copyID
Slide 2
Video Rental System
VideoDescription
barCode
title
type
……..
Member
name
address
phoneNumber
creditCard#
emailAddress
userName
password
Rental
rentalStore
rentalDate
1
dueDate
*
request
returnDate
returnTime
1
*
*
1
rents
*
VideoCopy
copyID
• In design you realized you realized you needed a method to make the statement to
for the rentals…(you might have placed it in MEMBER or the use case class
RENTVIDEO
• While other code would be present, there would be a method that calculates the cose
of the movie depending on the days and the price of the movie
• There would be a switch or case statement to select the price depending on the type
Slide 3
Video Rental System
public Void makeStatement () {
int price = 0, total = 0, int days
Iterator videos = rents.iterator();
…..
while (videos.hasNext()) {
Rental rents = (Rental) videos.next();
int type = rents.getMovie().getType();
switch (type) {
case Movie.REGULAR: price = 200; break;
case Movie.NEWRELEASE: price = 300; break;
case Movie.CHILDREN: price = 100; break;
days = computeDays(rentalDate);
cost = days * price;
}……..
Slide 4
Video Rental System
public Void makeStatement () {
int price = 0, total = 0
Iterator videos = rents.iterator();
…..
Make this a method
while (videos.hasNext()) {
called computeCost
Rental rents = (Rental) videos.next();
int type = rents.getMovie().getType();
switch (type) {
case Movie.REGULAR: price = 200; break;
case Movie.NEWRELEASE: price = 300; break;
case Movie.CHILDREN: price = 100; break;
days = computeDays(rentalDate);
cost = days * price;
…..
Slide 5
Video Rental System
public Void makeStatement () {
int price = 0, total = 0
Now it is a method that
Iterator videos = rents.iterator();
returns the cost of the
…..
rental and should
while (videos.hasNext()) {
probably be placed in the
Rental rents = (Rental) videos.next();
RENTAL CLASS
int type = rents.getMovie().getType();
switch (type) {
Rental
rentalStore
case Movie.REGULAR: price = 200; break;
rentalDate
dueDate
case Movie.NEWRELEASE: price = 300; break;
returnDate
case Movie.CHILDREN: price = 100; break;
returnTime
computeDays
days = computeDays(rentalDate);
computeCost
cost = days * price;
…..
Slide 6
Video Rental System
public Void makeStatement () {
BUT: getCost uses type from from
the MovieDescription to decide the
int price = 0, total = 0
price. We could pass the days to
Iterator videos = rents.iterator();
MovieDescription and have it select
…..
the price since it has the type.
while (videos.hasNext()) {
Rental rents = (Rental) videos.next();
int type = rents.getMovie().getType();
switch (type) {
VideoDescription
case Movie.REGULAR: price = 200; break;
barCode
case Movie.NEWRELEASE: price = 300; break;
title
Type
case Movie.CHILDREN: price = 100; break;
getCost (days)
days = computeDays(rentalDate);
……..
cost = days * price;
…..
Slide 7
Video Rental System
public Void makeStatement () {
Still: getCost currently are not
exploiting dynamic binding to make
int price = 0, total = 0
the case decisions
Iterator videos = rents.iterator();
==> sub-classing of three different
…..
sub-types: Regular, NewRelease,
while (videos.hasNext()) {
and Children would allow this
Rental rents = (Rental) videos.next();
int type = rents.getMovie().getType();
switch (type) {
VideoDescription
case Movie.REGULAR: price = 200; break;
case Movie.NEWRELEASE: price = 300; break;
case Movie.CHILDREN: price = 100; break;
days = computeDays(rentalDate);
Children
NewRelease
Regular
cost = days * price;
…..
Slide 8
Video Rental System
VideoDescription
barCode
title
type
……..
Regular
getCost
Children
getCost
NewRelease
getCost
NOTE: even more flexibility can be achieved if the class model is developed further
to a framework by applying a construct like the Strategy Pattern.
Slide 9
Video Rental System
9. step -> additional flexibility by adding a class Price responsible for the pricing strategy acting as framework hot-spot
VideoDescription
barCode
title
type
……..
Price
getCost
Regular
getCost
Children
getCost
NewRelease
getCost
So we add a class responsible for the pricing strategy……
Slide 10
Video Rental System
abstract class Price {
public abstract int getCost (int days);
}
class Regular extends Price {
public int getCost (int days) {
return days * 200;
}
}
class NewRelease extends Price {
public int getCost (int days) { return days * 300; }
}
}
class Children extends Price {
public int getCost (int days) {
return days * 100;
}
}
Slide 11
Video Rental System
class MovieDescription {
private String title; …….
private Price pricing;
…..
public Price getPrice () { return price; }
….
public int getCharge (int days) { return pricing.getCost(days); }
}
Slide 12
Video Rental System
class Rental {
private MovieDescription movie;
private int days;
….
public Movie getMovie () { return movie; }
public int computeDays () { …..return days; }
public int getCost () { return movie.getCost(days); }
}
Slide 13
Download