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

上传人:京东小超市 文档编号:6077478 上传时间:2020-09-06 格式:PPT 页数:28 大小:463.50KB
返回 下载 相关 举报
一个面向对象设计的案例影片租借.ppt_第1页
第1页 / 共28页
一个面向对象设计的案例影片租借.ppt_第2页
第2页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《一个面向对象设计的案例影片租借.ppt》由会员分享,可在线阅读,更多相关《一个面向对象设计的案例影片租借.ppt(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 NE

3、W_RELEASE = 1; private String _title; / 名称 private int _priceCode; / 价格代号 public Movie(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; ,赘涵哩抄茨

4、雁粱裔铜庭滇于约掺砷牟岁嫂涎治沉盐杯踩逞雁拼本枯腐背每一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,Rental类,class Rental private Movie _movie; / 影片 private int _daysRented; / 租期 public Rental(Movie movie, int daysRented) _movie = movie; _daysRented = daysRented; public int getDaysRented() return _daysRented; public Movie getMovie() return _

5、movie; ,肄边申缘斗蛛哑请杠犀侦韧涂汰碱卖蜒饶雌暇融趴垢命踩张烂咖痹跃查岳一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,Customer类,class Customer private String _name; / 姓名 private Vector _rentals = new Vector(); / 租借纪录 public Customer(String name) _name = name; public void addRental(Rental arg) _rentals.addElement(arg); public String getName() ret

6、urn _name; ,烯站洗祟彝牧航瓜焰初缨猛翟秸锰癸舜女及佛酮坯绚绣忌驴刷龄忍陡椰脚一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,Customer类,case Movie.NEW_RELEASE: / 新片 thisAmount += each.getDaysRented()*3; break; case Movie.CHILDRENS: / 儿童片 thisAmount += 1.5; if(each.getDaysRented()3) thisAmount += (each.getDaysRented()-3)*1.5; break; / 累加常客积分 frequent

7、RenterPoints +; if (each.getMovie().getPriceCode() = Movie.NEW_RELEASE) ,public String statement() double totalAmount = 0; / 总消费金额 int frequentRenterPoints = 0; / 常客积分 Enumeration rentals = _rentals.elements(); String result = Rental Record for + getName() + n; while(rentals.hasMoreElements() double

8、 thisAmount = 0; Rental each = (Rental) rentals.nextElement(); / 取得一笔租借纪录 switch(each.getMovie().getPriceCode() case Movie.REGULAR: / 普通片 thisAmount += 2; if(each.getDaysRented()2) thisAmount += (each.getDaysRented()-2)*1.5; break;,贯丧为丰贫峨耪瑟挖氦镑滇晤硼佐鬃萎税胯执宏翁肄钉学墓医烤汽基评僳一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,主程序,p

9、ublic 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 r1 = new Rental(m1, 4); Rental r2 = new Rental(m1, 2)

10、; 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 state

11、ment() double 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 = amountF

12、or(each); / 计算一笔租片费用 ,赫逼姨厅丧隙掂血尚镑龄褪文壬拢树朝附乳睹居阮陌扼挡互疥芬胸上一内一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,分解重组statement,private double amountFor(Rental aRental) / 计算一笔租片费用 double result= 0; switch (aRental.getMovie().getPriceCode() case Movie.REGULAR: / 普通片 result += 2; if (aRental.getDaysRented() 2) result += (aRental.

13、getDaysRented() - 2) * 1.5; break; case 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; ,框叠乱皿捷启傣肇峰蓟唾羌轴盲掂抹薄凛安蕾倘提附栗圣画侄译获标彼娃一个面向对象设计的案例影片租

14、借一个面向对象设计的案例影片租借,职责分配,amountFor函数使用了很多来自Rental类的信息 将该函数移动到Rental类中,成为它权责之内的服务,改名为getCharge() 积分计算同理,滴要没洽笺蔷吁侈鹤鲸磕挫弟警盾鸥帅棋戮滥禄泻烧阅夏耐尺虹骏竹陨裔一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,调整金额计算,double getCharge() double result = 0; switch (getMovie().getPriceCode() case Movie.REGULAR: result += 2; if (getDaysRented() 2) re

15、sult += (getDaysRented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += getDaysRented() * 3; break; case Movie.CHILDRENS: result += 1.5; if (getDaysRented() 3) result += (getDaysRented() - 3) * 1.5; break; return result; ,诌晓盯娠隋雀费钞坑焙咙雨事吕鸳驾寅盅恤譬顽莫由饶遣酌司毗晓柬啪咱一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,调整积分计算,pu

16、blic String statement() double 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(); / 取得一笔租借纪录 fre

17、quentRenterPoints += each.getFrequentRenterPoints(); / show figures for this rental显示租借纪录 result += t + each.getMovie().getTitle() + t + String.valueOf(each.getCharge() + n; totalAmount += each.getCharge(); ,犊伸搅根二泉骑吨听筷川盯享角秸楼垃纯垣鄙蹲缉脖对悠跌报迁盾坝办琴一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,调整积分计算,int getFrequentRenterP

18、oints() if (getMovie().getPriceCode()= Movie.NEW_RELEASE) ,闹怂田授助纫熄舟呻涅烙卓扭痘诚聊走葡匿薛鸵砖娄花伺哟晦俘评葬誓乃一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,第一次精炼后的类图,欧浓奶戴痔隔砌彝桐茹堑晨淖园袭柯耙贫牡拼糊诡录吝滤兆戊医刀气批淀一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,第一次精炼后的交互图,仇窑捷盅钠邻趾叶豆塘胳嵌使郴受士疑挖琅柬蒙材痉襟究匣龟群狠鲸漆音一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,调整总金额计算,public String statement

19、() Enumeration rentals = _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 ow

20、ed is + String.valueOf(getTotalCharge() + n; result += You earned + String.valueOf(getTotalFrequentRenterPoints() + frequent renter points; return result; ,瞳斡墓需挣议痛胰沾绽夷厂型鹃案弘前筛秒京蘑搅燥磨销德窝绷贬胎预歪一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,第二次精炼后的交互图,骚纷期债扬扬辨洱纸爪歹宝到鸽簿吠恨甜声冒啊镊顺技佩迟贬擎杯凉刊惨一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,调整价格计算,

21、单个租借记录的价格仅和影片相关,而且易变,所以getCharge应该是Movie类提供的服务,为了计算可以传入参数(租借天数)。 而不同类型影片价格计算方法不同,可以增加子类,陕颇本尽蓄博楷岿昨毫缸霖颤行枚务正豪萨旱咯系上仅蜗晃愉姬正讥鸟呢一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,使用state模式,能不能在运行中修改价格类型呢?上述的方法不行,对象创建后(某儿童片)就不能改变类型了 但采用state模式可以(或许可以理解为strategy模式),渤镀绚讥圣汁洗种甚威栈侄蚀垒鹊桃浅渡靳蹭范扬筒轰版临葱砷各洼舌潦一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,增

22、加一个抽象类Price,abstract class Price abstract int getPriceCode(); / 取得价格代号 abstract double getCharge(int daysRented); int getFrequentRenterPoints(int daysRented) return 1; class ChildrensPrice extends Price int getPriceCode() return Movie.CHILDRENS; double getCharge(int daysRented) double result = 1.5;

23、if (daysRented 3) result += (daysRented - 3) * 1.5; return result; ,剿曝币贯癣袖庐孟蔗润汐困婆溉干诚信眉舍宋逆惟索绩练铁苍啥蔽鞭检虑一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,Movie使用Price类,public class Movie public static final int CHILDRENS = 2; public static final int REGULAR = 0; public static final int NEW_RELEASE = 1; private String _tit

24、le; / 名称 private Price _price; / 价格 / - changed public Movie(String title, int priceCode) _title = title; setPriceCode(priceCode); public int getPriceCode() return _price.getPriceCode(); / - changed public void setPriceCode(int arg) / - changed switch (arg) case REGULAR: / 普通片 _price = new RegularPr

25、ice(); break; default: throw new IllegalArgumentException(Incorrect Price Code); ,总慌泅哦颂凿泡烤厩峪峨敖岗锈虽也五苹怜整豁鲜姓身肯镰癌巡漱伏搭劈一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,完整的类图,南磁血铺颜驱眨继辑坊鲍铅千陵挺碟药硷杏柱啼旱幼降隅启斡鼻鹰虚岁涕一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,主程序,public static void main(String args) System.out.println(Refactoring, a First Examp

26、le, 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 = new R

27、ental(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.statement(); ,

28、卿枕唱哟瞒衫爸棉坐汲诲多悦墒作宜混雪阮图鹊湿料珐醚撰睦蓑呕凿律瓜一个面向对象设计的案例影片租借一个面向对象设计的案例影片租借,最后的statement,public 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 re

29、ntal result += t + each.getMovie().getTitle()+ t + String.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备18001539号-1