一个面向对设计的案例影片租借

上传人:公**** 文档编号:577662146 上传时间:2024-08-22 格式:PPT 页数:28 大小:464.52KB
返回 下载 相关 举报
一个面向对设计的案例影片租借_第1页
第1页 / 共28页
一个面向对设计的案例影片租借_第2页
第2页 / 共28页
一个面向对设计的案例影片租借_第3页
第3页 / 共28页
一个面向对设计的案例影片租借_第4页
第4页 / 共28页
一个面向对设计的案例影片租借_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《一个面向对设计的案例影片租借》由会员分享,可在线阅读,更多相关《一个面向对设计的案例影片租借(28页珍藏版)》请在金锄头文库上搜索。

1、一个面向对象设计的案例一个面向对象设计的案例影碟出租系统影碟出租系统问题描述问题描述一个影片出租店需要计算每一位顾客的消费金一个影片出租店需要计算每一位顾客的消费金额并打印报表额并打印报表操作者提供给系统:顾客租借的影片、租期,操作者提供给系统:顾客租借的影片、租期,系统根据租赁时间和影片类型计算费用系统根据租赁时间和影片类型计算费用影片分普通片、儿童片和新片影片分普通片、儿童片和新片常客还会有积分数,积分点数根据常客还会有积分数,积分点数根据“租片种类租片种类是否为新片是否为新片”而又不同而又不同最初的类图最初的类图Movie:只是一个简单的纯数据类只是一个简单的纯数据类Rental:表示某

2、个顾客的一次租借记录表示某个顾客的一次租借记录Customer:顾客顾客最初的交互图最初的交互图Statement用于计算并将结果制作报表用于计算并将结果制作报表Movie类类public class Movie public static final int CHILDRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; private String _title; / 名称名称 private int _priceCode; / 价格代号价格代号 public Movi

3、e(String title, int priceCode) _title = title; _priceCode = priceCode; public int getPriceCode() return _priceCode; public void setPriceCode(int arg) _priceCode = arg; public String getTitle() return _title; Rental类类class Rental private Movie _movie; / 影片影片 private int _daysRented; / 租期租期 public Ren

4、tal(Movie movie, int daysRented) _movie = movie; _daysRented = daysRented; public int getDaysRented() return _daysRented; public Movie getMovie() return _movie; Customer类类class Customer private String _name; / 姓名姓名 private Vector _rentals = new Vector(); / 租借纪录租借纪录 public Customer(String name) _name

5、 = name; public void addRental(Rental arg) _rentals.addElement(arg); public String getName() return _name; Customer类类 case Movie.NEW_RELEASE: / 新片新片 thisAmount += each.getDaysRented()*3; break; case Movie.CHILDRENS: / 儿童片儿童片 thisAmount += 1.5; if(each.getDaysRented()3) thisAmount += (each.getDaysRen

6、ted()-3)*1.5; break; / 累加常客积分累加常客积分 frequentRenterPoints +; if (each.getMovie().getPriceCode() = Movie.NEW_RELEASE) & each.getDaysRented() 1) frequentRenterPoints +; /显示显示 result += t + each.getMovie().getTitle() + t + String.valueOf(thisAmount) + n; totalAmount += thisAmount; / add footer lines结尾打印

7、结尾打印 result += Amount owed is + String.valueOf(totalAmount) + n; result += You earned + String.valueOf(frequentRenterPoints) + frequent renter points; return result; public String statement() double totalAmount = 0; / 总消费金额总消费金额 int frequentRenterPoints = 0; / 常客积分常客积分 Enumeration rentals = _rentals

8、.elements(); String result = Rental Record for + getName() + n; while(rentals.hasMoreElements() double thisAmount = 0; Rental each = (Rental) rentals.nextElement(); / 取取得一笔租借纪录得一笔租借纪录 switch(each.getMovie().getPriceCode() case Movie.REGULAR: / 普通片普通片 thisAmount += 2; if(each.getDaysRented()2) thisAm

9、ount += (each.getDaysRented()-2)*1.5; break;主程序主程序 public static void main(String args) System.out.println(Refactoring, a First Example, step1); Movie m1 = new Movie(Seven, Movie.NEW_RELEASE); Movie m2 = new Movie(Terminator, Movie.REGULAR); Movie m3 = new Movie(Star Trek, Movie.CHILDRENS); Rental r

10、1 = new Rental(m1, 4); Rental r2 = new Rental(m1, 2); Rental r3 = new Rental(m3, 7); Rental r4 = new Rental(m2, 5); Rental r5 = new Rental(m3, 3); Customer c1 = new Customer(jjhou); c1.addRental(r1); c1.addRental(r4);。 System.out.println(c1.statement(); 分解重组分解重组statement public String statement() do

11、uble totalAmount = 0; / 总金额总金额 int frequentRenterPoints = 0; / 常客积分常客积分 Enumeration rentals = _rentals.elements(); String result = Rental Record for + getName() + n; while(rentals.hasMoreElements() double thisAmount = 0; Rental each = (Rental) rentals.nextElement(); / 取得一笔取得一笔租借纪录租借纪录 thisAmount = a

12、mountFor(each); / 计算一笔租片费用计算一笔租片费用分解重组分解重组statementprivate double amountFor(Rental aRental) / 计算一笔租片费用计算一笔租片费用 double result= 0; switch (aRental.getMovie().getPriceCode() case Movie.REGULAR: / 普通片普通片 result += 2; if (aRental.getDaysRented() 2) result += (aRental.getDaysRented() - 2) * 1.5; break; ca

13、se Movie.NEW_RELEASE: / 新片新片 result += aRental.getDaysRented() * 3; break; case Movie.CHILDRENS: / 儿童片儿童片 result += 1.5; if (aRental.getDaysRented() 3) result += (aRental.getDaysRented() - 3) * 1.5; break; return result; 职责分配职责分配amountFor函数使用了很多来自函数使用了很多来自Rental类的信类的信息息将该函数移动到将该函数移动到Rental类中,成为它权责之内

14、类中,成为它权责之内的服务,改名为的服务,改名为getCharge()积分计算同理积分计算同理调整金额计算调整金额计算 double getCharge() double result = 0; switch (getMovie().getPriceCode() case Movie.REGULAR: result += 2; if (getDaysRented() 2) result += (getDaysRented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += getDaysRented() * 3; break; case

15、 Movie.CHILDRENS: result += 1.5; if (getDaysRented() 3) result += (getDaysRented() - 3) * 1.5; break; return result; 调整积分计算调整积分计算 public String statement() double totalAmount = 0; / 总金额总金额 int frequentRenterPoints = 0; / 常客积分常客积分 Enumeration rentals = _rentals.elements(); String result = Rental Reco

16、rd for + getName() + n; while(rentals.hasMoreElements() double thisAmount = 0; Rental each = (Rental) rentals.nextElement(); / 取得一笔租借纪录取得一笔租借纪录 frequentRenterPoints += each.getFrequentRenterPoints(); / show figures for this rental显示租借纪录显示租借纪录 result += t + each.getMovie().getTitle() + t + String.val

17、ueOf(each.getCharge() + n; totalAmount += each.getCharge(); 调整积分计算调整积分计算 int getFrequentRenterPoints() if (getMovie().getPriceCode()= Movie.NEW_RELEASE) & getDaysRented() 1) return 2; else return 1; 第一次精炼后的类图第一次精炼后的类图第一次精炼后的交互图第一次精炼后的交互图调整总金额计算调整总金额计算 public String statement() Enumeration rentals =

18、_rentals.elements(); String result = Rental Record for + getName() + n; while (rentals.hasMoreElements() Rental each = (Rental) rentals.nextElement(); result += t + each.getMovie().getTitle()+ t + String.valueOf(each.getCharge() + n; /add footer lines结尾打印结尾打印 result += Amount owed is + String.valueO

19、f(getTotalCharge() + n; result += You earned + String.valueOf(getTotalFrequentRenterPoints() + frequent renter points; return result; 第二次精炼后的交互图第二次精炼后的交互图调整价格计算调整价格计算单个租借记录的价格仅和影片相关,而且易变,所单个租借记录的价格仅和影片相关,而且易变,所以以getCharge应该是应该是Movie类提供的服务,为了计算类提供的服务,为了计算可以传入参数(租借天数)。可以传入参数(租借天数)。而不同类型影片价格计算方法不同,可以增加

20、子类而不同类型影片价格计算方法不同,可以增加子类使用使用state模式模式能不能在运行中修改价格类型呢?上述的方法不行,能不能在运行中修改价格类型呢?上述的方法不行,对象创建后(某儿童片)就不能改变类型了对象创建后(某儿童片)就不能改变类型了但采用但采用state模式可以(或许可以理解为模式可以(或许可以理解为strategy模式)模式)增加一个抽象类增加一个抽象类Priceabstract class Price abstract int getPriceCode(); / 取得价格代号取得价格代号 abstract double getCharge(int daysRented); int

21、 getFrequentRenterPoints(int daysRented) return 1; class ChildrensPrice extends Price int getPriceCode() return Movie.CHILDRENS; double getCharge(int daysRented) double result = 1.5; if (daysRented 3) result += (daysRented - 3) * 1.5; return result; Movie使用使用Price类类public class Movie public static f

22、inal int CHILDRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; private String _title; / 名称名称 private Price _price; / 价格价格 / - changed public Movie(String title, int priceCode) _title = title; setPriceCode(priceCode); public int getPriceCode() return _price.getP

23、riceCode(); / - changed public void setPriceCode(int arg) / - changed switch (arg) case REGULAR: / 普通片普通片 _price = new RegularPrice(); break; default: throw new IllegalArgumentException(Incorrect Price Code); 完整的类图完整的类图主程序主程序public static void main(String args) System.out.println(Refactoring, a Firs

24、t Example, step7); Movie m1 = new Movie(Seven, Movie.NEW_RELEASE); Movie m2 = new Movie(Terminator, Movie.REGULAR); Movie m3 = new Movie(Star Trek, Movie.CHILDRENS); Rental r1 = new Rental(m1, 4); Rental r2 = new Rental(m1, 2); Rental r3 = new Rental(m3, 7); Rental r4 = new Rental(m2, 5); Rental r5

25、= new Rental(m3, 3); Customer c1 = new Customer(jjhou); c1.addRental(r1); c1.addRental(r4); Customer c3 = new Customer(jiangtao); c3.addRental(r3); c3.addRental(r5); System.out.println(c1.statement(); System.out.println(c2.statement(); System.out.println(c3.statement(); System.out.println(c4.stateme

26、nt(); 最后的最后的statementpublic String statement() Enumeration rentals = _rentals.elements(); String result = Rental Record for + getName() + n; while (rentals.hasMoreElements() Rental each = (Rental) rentals.nextElement(); /show figures for this rental result += t + each.getMovie().getTitle()+ t + Stri

27、ng.valueOf(each.getCharge() + n; /add footer lines结尾打印结尾打印 result += Amount owed is + String.valueOf(getTotalCharge() + n; result += You earned + String.valueOf(getTotalFrequentRenterPoints() + frequent renter points; return result; Statement的完整顺序图的完整顺序图多态多态可以使用可以使用State模式来实现多态模式来实现多态随意增加一个子类,不影响其他代码随意增加一个子类,不影响其他代码符合封闭符合封闭-开放原则:开放原则:封闭:不修改代码(比如原来提供的封闭:不修改代码(比如原来提供的dll库)库)开放:可以扩展新内容开放:可以扩展新内容

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号