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