Presentation is loading. Please wait.

Presentation is loading. Please wait.

Design Patterns.

Similar presentations


Presentation on theme: "Design Patterns."— Presentation transcript:

1 Design Patterns

2 Video Rental System Rental of each movie is determined by the type.
VideoDescription barCode title type …….. 1 * Member Rental * name address phoneNumber creditCard# Address userName password rentalStore rentalDate dueDate returnDate returnTime VideoCopy * * rents copyID request 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

3 Video Rental System VideoDescription barCode title type …….. 1 * Member Rental * name address phoneNumber creditCard# Address userName password rentalStore rentalDate dueDate returnDate returnTime VideoCopy * * rents copyID request 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

4 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; }……..

5 Make this a method called computeCost
Video Rental System public Void makeStatement () { int price = 0, total = 0 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; Make this a method called computeCost During design we recognized we would need an algorithm to compute the days of the rental…. We assume no overdues for simplicity of our example So…. We make a method (not specified here) We then use that method to compute cost based on price But this needs to be a method of its own…..

6 Video Rental System public Void makeStatement () {
int price = 0, total = 0 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; Now it is a method that returns the cost of the rental and should probably be placed in the RENTAL CLASS Rental rentalStore rentalDate dueDate returnDate returnTime computeDays computeCost Then we realize that this method is misplaced

7 Video Rental System public Void makeStatement () {
int price = 0, total = 0 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; BUT: getCost uses type from from the MovieDescription to decide the price. We could pass the days to MovieDescription and have it select the price since it has the type. VideoDescription barCode title Type getCost (days) …….. Then we realize it is still not in the right place

8 Video Rental System public Void makeStatement () {
int price = 0, total = 0 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; Still: getCost currently are not exploiting dynamic binding to make the case decisions ==> sub-classing of three different sub-types: Regular, NewRelease, and Children would allow this VideoDescription A better design but an opportunitiy for a pattern may be here Regular Children NewRelease

9 Video Rental System VideoDescription barCode title type …….. The strategy pattern is certainly in order when you are basing behavior on a type. Regular Children NewRelease getCost getCost 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.

10 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 During design we recognized we would need an algorithm to compute the days of the rental…. We assume no overdues for simplicity of our example So…. We make a method (not specified here) We then use that method to compute cost based on price But this needs to be a method of its own….. Regular Children NewRelease getCost getCost getCost So we add a class responsible for the pricing strategy……

11 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 { return days * 100; ….. Then we realize it is still not in the right place

12 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); } } Then we realize it is still not in the right place

13 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); } } Then we realize it is still not in the right place


Download ppt "Design Patterns."

Similar presentations


Ads by Google