当前位置首页 > 法律/法规/法学 > 理论/案例
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

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

文档格式:PPT| 28 页|大小 464.54KB|积分 10|2022-11-14 发布|文档ID:169015284
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 28
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 一个面向对象设计的案例一个面向对象设计的案例影碟出租系统影碟出租系统问题描述问题描述 一个影片出租店需要计算每一位顾客的消费一个影片出租店需要计算每一位顾客的消费金额并打印报表金额并打印报表 操作者提供给系统:顾客租借的影片、租期,操作者提供给系统:顾客租借的影片、租期,系统根据租赁时间和影片类型计算费用系统根据租赁时间和影片类型计算费用 影片分普通片、儿童片和新片影片分普通片、儿童片和新片 常客还会有积分数,积分点数根据常客还会有积分数,积分点数根据“租片种租片种类是否为新片类是否为新片”而又不同而又不同最初的类图最初的类图 Movie:只是一个简单的纯数据类:只是一个简单的纯数据类 Rental:表示某个顾客的一次租借记录:表示某个顾客的一次租借记录 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 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;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 _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()return _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;/累加常客积分累加常客积分 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结尾打印结尾打印 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.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)thisAmount+=(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 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 Rental(m3,3);Customer c1=new Customer(jjhou);c1.addRental(r1);c1.addRental(r4);。

    System.out.println(c1.statement();分解重组分解重组statement public 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();/取得一笔取得一笔租借纪录租借纪录 thisAmount=amountFor(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;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;职责分配职责分配 amountFor函数使用了很多来自函数使用了很多来自Rental类的信类的信息息 将该函数移动到将该函数移动到Rental类中,成为它权责之内类中,成为它权责之内的服务,改名为的服务,改名为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 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 Record 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.valueOf(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=_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.valueOf(getTotalCharge()+n;result+=You earned +String.valueOf(getTotalFrequentRenterPoints()+frequent renter points;return result;第二次精炼后的交互图第二次精炼后的交互图调整价格计算调整价格计算单个租借记录的价格仅和影片相关,而且易变,所单个租借记录的价格仅和影片相关,而且易变,所以以getCharge应该是应该是Movie类提供的服务,为了计算类提供的服务,为了计算可以传入参数(租借天数)。

    可以传入参数(租借天数)而不同类型影片价格计算方法不同,可以增加子类而不同类型影片价格计算方法不同,可以增加子类使用使用state模式模式能不能在运行中修改价格类型呢?上述的方法不行,能不能在运行中修改价格类型呢?上述的方法不行,对象创建后(某儿童片)就不能改变类型了对象创建后(某儿童片)就不能改变类型了但采用但采用state模式可以(或许可以理解为模式可以(或许可以理解为strategy模式)模式)增加一个抽象类增加一个抽象类Priceabstract 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;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 _title;/名称名称 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 RegularPrice();break;default:throw new IllegalArgumentException(Incorrect Price Code);完整的类图完整的类图主程序主程序public static void main(String args)System.out.println(Refactoring,a First 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=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.statement();最后的最后的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+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库)库)开放:可以扩展新内容开放:可以扩展新内容。

    点击阅读更多内容
    卖家[上传人]:沈阳哈登
    资质:实名认证