第33页之前,即“1.4 运用多态取代与价格相关的条件逻辑”之前的代码:
// movie.js
class Movie {
constructor() {
let CHILDRENS = 2;
let REGULAR = 0;
let NEW_RELEASE = 1;
this._title;
this._priceCode;
}
movie(title, priceCode) {
this._title = title;
this._priceCode = priceCode;
}
getPriceCode() {
return _priceCode;
}
setPriceCode(arg) {
_priceCode = arg;
}
getTitle() {
return _title;
}
}
module.exports.Movie = Movie;
// rental.js
const { Movie } = require("./movie.js");
class Rental {
constructor() {
let _movi = new Movie();
let _daysRented;
}
Rental(movie, daysRented) {
_movie = movie;
_daysRented = daysRented;
}
getDaysRented() {
return _daysRented;
}
getMovie() {
return _movie;
}
getCharge() {
let result = 0;
switch (this.getMovie().getPriceCode()) {
case this.REGULAR:
result += 2;
if (this.getDaysRented() > 2) {
result += (this.getDaysRented() - 2) * 1.5;
}
break;
case this.NEW_RELEASE:
result += this.getDaysRented() * 3;
break;
case this.CHILDRENS:
result += 1.5;
if (this.getDaysRented() > 3) {
result += (this.getDaysRented() - 3) * 1.5;
}
break;
}
return result;
}
getFrequentRenterPoints() {
if ((item.getMovie().getPriceCode() == this.NEW_RELEASE) && item.getDaysRented() > 1) {
return 2;
} else {
return 1;
}
}
}
// customer.js
import { Movie } from "./movie";
class Customer {
constructor(name) {
let CHILDRENS = 2;
let REGULAR = 0;
let NEW_RELEASE = 1;
let _name = name;
let _rentals = [];
}
addRental(arg) {
_rentals.addRental(arg);
}
getName() {
return _name;
}
//用于生成详单的函数
statement() {
let result = "Rental Record for " + getName() + "\n";
for (let item of _rentals) {
result += "\t" + item.getMovie().getTitle() + "\t" + String.valueOf(this.getTotalCharge()) + "\n";
}
result += "Amount owed is " + totalAmount.toString() + "\n";
result += "You earned " + this.getTotalFrequentRenterPoints().toString() + " frequent renter points";
return result;
}
getTotalCharge() {
let result = 0;
for (let i = 0; i < this._rentals.length; i++) {
result += this._rentals[i].getCharge();
}
return result;
}
getTotalFrequentRenterPoints() {
let result = 0;
for (let i = 0; i < this._rentals.length; i++) {
result += this._rentals[i].getFrequentRenterPoints();
}
return result;
}
}