设计模式_大作业
设计模式大作业实验报告

设计模式⼤作业实验报告蛋糕订购系统⼀、实验介绍(3)⼆、实验环境(3)三、系统流程(3)四、系统总类图(4)五、程序源代码及各个模块⼦类图(5)六、程序运⾏截图(22)七、实验总结(22)⼀、实验介绍本系统使⽤了简单⼯⼚模式、⼯⼚⽅法模式、单例模式、门⾯模式、策略模式、观察者模式⼀共6种模式实现了从蛋糕店订购订购蛋糕的这样⼀个系统。
⼆、实验环境Windows操作系统、MyEclipse10.0、MySQL 5.5、jdk1.6三、系统流程四、系统总类图五、程序源代码及各个模块⼦类图(⼀)测试类Client.java:package net.xsl.ordercake.test;import net.xsl.ordercake.discount.DiscountStyleThree;import net.xsl.ordercake.discount.OrderCake;import net.xsl.ordercake.order.CakeShop;import net.xsl.ordercake.order.EastVilla;import net.xsl.ordercake.order.WestVilla;publicclass Client {publicstaticvoid main (String arg[]){CakeShop starCakeShop = CakeShop.getCakeShop();new WestVilla(starCakeShop, "草莓⽔果"); starCakeShop.getNewName("西13");starCakeShop.notifyCustomer();OrderCake cake = new OrderCake();System.out.println("今⽇促销⼀律8折优惠");cake.setM(8);cake.setStyle(new DiscountStyleThree());cake.setPrice(80) ;System.out.println("本次订购成功完成,需要⽀付的⾦额为"+cake.getMoney(cake.getPrice(),cake.getM())+",原价80"); System.out.println("================================="); new EastVilla(starCakeShop, "甜奶");starCakeShop.getNewName("东18");starCakeShop.notifyCustomer();System.out.println("================================="); starCakeShop.getNewName("东12");starCakeShop.notifyCustomer();}}(⼆)折扣的接⼝和⽅法(策略模式):a)接⼝DiscountStyle.java:package net.xsl.ordercake.discount;publicinterface DiscountStyle {publicdouble disCount(double price,double m);}b)折⽅式⼀DiscountStyleOne.java:package net.xsl.ordercake.discount;publicclass DiscountStyleOne implements DiscountStyle{ publicdouble disCount(double price,double m) {return price;}}c)打折⽅式⼆DiscountStyleTwo.java:package net.xsl.ordercake.discount;publicclass DiscountStyleTwo implements DiscountStyle{publicdouble disCount(double price,double m) {price = price - m;return price;}}d)打着⽅式三DiscountStyleThree.java:package net.xsl.ordercake.discount;publicclass DiscountStyleThree implements DiscountStyle{ publicdouble disCount(double price,double m) { price = price * m/10;return price;}}e)订蛋糕对象类,使⽤了get/set⽅法OrderCake.java:package net.xsl.ordercake.discount;publicclass OrderCake {double money,price;//money是打折后的最终价格,price是原价DiscountStyle style;double m;publicdouble getMoney(double price,double m){return style.disCount(price,m);}publicvoid setPrice(double price){this.price = price ;}publicdouble getPrice(){return price;}publicvoid setStyle(DiscountStyle style){this.style = style ;}public DiscountStyle getStyle(){return style;}publicvoid setM(double m){this.m = m ;}publicdouble getM(){return m;}}(三)顾客向蛋糕订购蛋糕(观察者模式),并在具体主题中使⽤了单例模式a)主题Shop.java:package net.xsl.ordercake.order;publicinterface Shop {publicvoid addCustomer(Customer o);publicvoid deleteCustomer(Customer o);publicvoid notifyCustomer();}b)具体主题(使⽤了单例模式,只能创建⼀个蛋糕商店的对象)CakeShop.java:package net.xsl.ordercake.order;import java.util.ArrayList;publicclass CakeShop implements Shop{String name;boolean changed;ArrayListpersonList;privateint i = 0;privatestatic CakeShop uniqueCakeShop;private CakeShop() {uniqueCakeShop = this;personList = new ArrayList();name = "";changed = false;}publicstaticsynchronized CakeShop getCakeShop(){if(uniqueCakeShop == null){uniqueCakeShop = new CakeShop();}return uniqueCakeShop;}publicvoid addCustomer(Customer o) { if(!(personList.contains(o))) personList.add(o);}publicvoid deleteCustomer(Customer o) { if((personList.contains(o))) personList.remove(o);}publicvoid notifyCustomer() {if(changed){try{Customer customer = personList.get(i); customer.orderCake(name);i++;changed = false;}catch(Exception e){System.out.println("没有新的订购信息"); }}}publicvoid getNewName(String str){if(str.equals(name))changed = false;else{name = str;changed = true;}}}c)观察者Customer.java:package net.xsl.ordercake.order;publicinterface Customer {publicvoid orderCake(String name);}d)体观察者⼀EastVilla.java:package net.xsl.ordercake.order;import net.xsl.ordercake.creator.MakeChocolateCake;import net.xsl.ordercake.creator.MakeFruityCake;import net.xsl.ordercake.creator.MakeMilkCake;import net.xsl.ordercake.jdbc.JDBCFacade;import net.xsl.ordercake.product.ChocolateFactory;import net.xsl.ordercake.product.FruitFactory;import /doc/1410101953.htmlkFactory;publicclass EastVilla implements Customer{Shop shop;private String cakeType;public EastVilla(Shop shop,String cakeType){this.shop = shop;this.cakeType = cakeType;shop.addCustomer(this);}publicvoid orderCake(String name){System.out.println(name+"订了⼀个"+cakeType+"蛋糕");JDBCFacade dbFacade=new JDBCFacade();String sqlStr = "select * from ordercake";String sqlStr1 = "insert into ordercake(cakeType, name, quantity)"+ " VALUES ('"+cakeType+"','"+name+"','1')"; dbFacade.jdbcInsert(sqlStr1);System.out.println("查询插⼊之后新的数据库");dbFacade.jdbcSelect(sqlStr);if(cakeType.equals("草莓⽔果") || cakeType.equals("葡萄⽔果")){MakeFruityCake eastVilla = new MakeFruityCake(cakeType);FruitFactory fruitCake = eastVilla.makeFruityCake();fruitCake.createCake();}elseif(cakeType.equals("⽜奶巧克⼒") || cakeType.equals("⿊巧克⼒")){MakeChocolateCake eastVilla1 = newMakeChocolateCake(cakeType);ChocolateFactory chocolateCake =eastVilla1.makeChocolateCake();chocolateCake.createCake();}elseif(cakeType.equals("双层鲜奶") || cakeType.equals("甜奶")){ MakeMilkCake eastVilla1 = new MakeMilkCake(cakeType); MilkFactory milkCake = eastVilla1.makeMilkCake(); milkCake.createCake();}}}e)具体观察者⼆WestVilla.java:。
大作业设计及实施,助力学生量感形成

大作业设计及实施,助力学生量感形成全文共四篇示例,供读者参考第一篇示例:大作业设计及实施在学生学习过程中起到了至关重要的作用,它不仅能够考察学生的知识掌握程度,还能够促进学生的自主学习和创新能力的提高。
通过设计和实施好的大作业,可以让学生更好地理解和掌握学科知识,提高学生的实践能力和创新意识,帮助学生形成对知识的感性认识和深刻理解。
大作业的设计必须贴近学科教学内容和学生的实际学习需求。
教师可以根据学科特点和学生的学习水平,设计具有挑战性和针对性的大作业,提高学生的学习兴趣和动力。
在设计大作业时,教师还可以结合学生的兴趣爱好和实际经验,设置丰富多样的任务和题目,激发学生的学习热情和创造力。
大作业的实施需要教师的指导和学生的自主参与相结合。
教师可以通过讲解和示范的方式,引导学生完成大作业的任务,帮助学生提高解决问题的能力和合作意识。
教师还可以设立明确的评估标准和评价体系,及时对学生的作业进行评价和反馈,激励学生不断提升自己的学习成绩和能力。
大作业的设计和实施需要学生的积极参与和主动思考。
学生在完成大作业的过程中,可以结合课堂知识和实际经验,深入探讨和研究问题,积极合作和交流,提高自己的认知能力和创新意识。
通过参与大作业的过程,学生可以感受到知识的魅力和学习的乐趣,形成对知识的感性认识和深刻理解。
大作业设计及实施是助力学生量感形成的重要途径和手段。
通过设计和实施好的大作业,可以有效提高学生的学习兴趣和动力,促进学生的自主学习和创新能力的提高,帮助学生形成对知识的感性认识和深刻理解。
教师在进行大作业设计和实施时要贴近学科教学内容和学生的实际学习需求,引导学生主动参与和思考,激发学生的学习热情和创造力,促进学生的全面发展和成长。
希望通过大作业设计及实施,学生可以更好地感受到学习的快乐和成就感,不断提升自己的学习能力和素质水平。
【2000字】第二篇示例:大作业设计及实施,助力学生量感形成引言大作业是高等教育中一种重要的教学方式,通过设计和实施大作业,可以帮助学生提升实践能力和问题解决能力,促进学生全方位发展。
哈工大现代设计方法大作业

2014年春季学期“机电产品现代设计方法”课程大作业一作业题目:雷达转台设计学生姓名:评阅教师:作业成绩:1.设计任务雷达底座转台设计:一个回转自由度承载能力:500kg被测件最大尺寸:Ф500×600mm台面跳动:,台面平面度:台面布置T型槽,便于负载安装方位转角范围:±120°具有机械限位和锁紧机构角位置测量精度:±5′角位置测量重复性:±3′角速度范围:°/s~60°/s2.设计流程如上图所示,整个设计过程分为功能设计、总体方案设计、详细设计和设计总结四部分。
功能设计部分要结合所给出的性能要求以及我们设计的转台的目标客户可能存在的功能需求,对转台的功能进行定义。
然后将转台的功能细化为小的功能单元,对应于一个个要实现功能的结构单元。
然后利用QFD图对要实现的各种功能实现综合评估,评价出功能需求的相对重要性及解决方案的相对重要性。
总体方案设计部分我们首先利用SysML语言来明确各部分功能的参数以及参数约束之间的关系,然后综合考虑各种参数,设计出整体的设计草图。
详细设计部分首先要使得零件实现其所对应的功能,使其满足其精度及强度的要求。
在此基础上,要综合考虑工件的可加工性,可装配性以及价格等因素,从而选出最符合我们需求的设计。
然后根据确定的参数和方案,利用三维建模软件CATIA来进行三维建模,并将3D图进行投影,得出适合工业加工的2D图,完成整个设计。
设计总结部分对整个过程中进行反思,考虑这个过程中存在的不足以及设计过程种学到的知识,以便应用于以后的设计当中。
设计QFD(全称Qualification Function Deployment)是进行设计总体规划的工具。
可以根据消费者的需求与需求的重要性来对工程设计做出相应的规划。
如图所示,其中第一纵行代表了安全性高,价格便宜,角度定位精度高及重复定位精度高等一系列的客户可能对所设计的转台所提出的要求。
人机交互界面设计大作业

人机交互界面设计大作业概述人机交互界面设计是现代科技发展中的一个重要领域。
随着计算机技术的迅猛发展,人们需要与计算机进行更加直接、高效的交互。
人机交互界面设计大作业旨在通过一个具体的项目案例,探讨人机交互界面设计的原理、方法和实践经验。
本文将详细介绍人机交互界面设计的过程、涉及的关键要素以及项目案例的实施细节。
项目背景在现代科技的推动下,计算机应用已经深入到人们的生活、工作和娱乐中的方方面面。
然而,用户与计算机之间的交互方式却一直是一个挑战。
传统的键盘鼠标方式已经无法满足人们对于更加直观、自然的交互需求。
因此,人机交互界面设计成为了一个研究热点。
设计原则在进行人机交互界面设计时,有一些重要的设计原则需要遵循:一、可用性可用性是人机交互界面设计的核心原则之一。
一个可用的界面应该易于学习、易于使用,并且能够帮助用户完成任务。
为了满足可用性的要求,设计师需要充分理解用户的需求和使用场景,并且通过适当的设计手段来提高用户的工作效率和满意度。
二、一致性一致性是人机交互界面设计的重要原则之一。
通过保持界面元素和操作的一致性,可以增加用户的熟悉感,并且降低用户学习新系统的成本。
设计师可以通过使用统一的布局、颜色和图标来实现界面的一致性。
三、反馈与可见性反馈与可见性是人机交互界面设计的重要原则之一。
通过给予用户及时的反馈信息,可以帮助用户正确地理解当前界面的状态,并且减少用户的疑惑和焦虑。
设计师可以使用合适的动画、声音和提示信息来提供反馈。
设计过程人机交互界面设计的过程包括以下几个关键步骤:一、需求分析在设计人机交互界面之前,首先需要对用户的需求进行详细分析。
设计师可以通过用户调研、用户访谈和用户行为分析等方法来获取用户需求的信息。
在需求分析的过程中,设计师应该关注用户的目标、任务和使用环境。
二、界面设计在完成需求分析之后,设计师可以开始进行界面设计工作。
界面设计包括界面元素的选择、布局的设计以及交互方式的确定等。
经过一个学期的学习请结合本次大作业谈谈你对设计模式的理解及想法

经过一个学期的学习请结合本次大作业谈谈你对设计模式的理解及想法设计模式是一种解决软件设计问题的经验总结和最佳实践。
在软件开发过程中,我们经常会遇到一些共同的问题,比如如何优化代码的结构,如何增强代码的可扩展性和可维护性,如何解决一些常见的设计难题等等。
而设计模式就是一类被反复使用的、可以解决这类问题的代码设计经验的总结。
通过本次大作业的学习,我进一步加深了对设计模式的理解和应用。
在实现大作业的过程中,我遇到了如何管理多个不同的游戏角色、如何实现游戏角色之间的互动和交流、如何提供不同种类的游戏装备等等问题。
这些问题都是常见的软件设计问题,通过使用设计模式,我成功地解决了这些问题,并实现了一个功能完整、可扩展和易维护的游戏系统。
设计模式的优点首先体现在代码的可读性和可维护性上。
通过使用设计模式,我们可以将代码的逻辑划分为不同的模块,每个模块都有清晰明确的职责和功能。
这样一来,代码的阅读和理解就变得更加容易,而且修改和维护代码时也更加方便。
在本次大作业中,我使用了工厂模式、观察者模式、策略模式等设计模式,大大提高了代码的可读性和可维护性。
其次,设计模式可以增强代码的可扩展性。
通过使用设计模式,我们可以将变化的部分和稳定的部分进行分离,从而使得系统的不同部分可以独立地变化和扩展,而不会对其他部分造成影响。
这样一来,当我们需要添加新的功能或者修改原有的功能时,可以更加方便地进行扩展和修改,而不必对整个系统进行大范围的重构。
在本次大作业中,我使用了装饰者模式来实现游戏角色的装备系统,通过装饰者模式,我可以在不修改原有代码的情况下,灵活地添加新的装备类型。
此外,设计模式还可以提高代码的复用性。
通过将常用的设计思想和模式抽象出来,我们可以将这些设计模式应用于不同的项目和场景中,从而提高代码的复用性。
在本次大作业中,我使用了单例模式来管理游戏中的资源,通过单例模式,我可以确保同一时间只有一个资源实例存在,从而避免了资源的重复加载和浪费。
经过一个学期的学习,请结合本次大作业,谈谈你对设计模式的理解及想法。(30分)

经过一个学期的学习,请结合本次大作业,谈谈你对设
计模式的理解及想法。
(30分)
设计模式是软件开发的一种重要机制,可以用于提高代码的重复使用性、灵活性和可操作性。
本次大作业,我学习了五种设计模式:单例模式、抽象工厂模式、桥接模式、策略者模式和代理模式。
通过各种例子,我深
刻理解了设计模式的实用性:单例模式可以使类的实例只有一个,从而避
免额外的初始化资源。
抽象工厂模式为客户提供一个通用的接口,根据不
同参数创建出不同的实例,使客户不需要关注具体的实现。
桥接模式对对
象的实现和行为的实现进行分离,提高可拓展性。
策略者模式定义了一系
列可以互相替换的算法,从而使得算法可以独立于使用它的客户端而变化。
代理模式为另外一个对象提供了一个替代或者代表,从而限制、增强或修
改对它的访问。
从本次大作业的学习中,我的对设计模式的理解是,设计
模式是一种经过实践检验的良好设计,可以用于设计软件系统,以满足客
户的需求。
它能够提高代码的可复用性和灵活性,使软件系统更具有可维
护性和可扩展性。
软件设计大作业
一需求分析此系统是一个类似于淘宝网的在线衣服销售系统,相当于淘宝网上的一个专门买衣服的网店,它具有用户注册,用户登录,修改密码,显示系统功能,查看订购历史以及订货。
1.1需求列表:(1)用户管理:用户管理的需求包括用户注册,用户登录以及修改密码。
用户注册是添加一个我们网上衣店的新用户;用户登录是用户想要进入系统时必须采取验证身份的步骤;修改密码是为了用户的安全性考虑,当密码存在不安全的因素时,适时修改密码。
(2)商品衣服的管理:商品管理包括订购衣服和查看订购衣服的历史。
订购衣服是当我们衣店的库存数量不足时必须采取的;查看订购衣服的历史有助于我们更好地了解衣服的订购情况。
(3)显示系统功能:此功能是用来让用户能很清楚地了解此系统所实现的各种功能。
1.2系统用例图:1.3用例分析及场景描述:用户注册用例:这部分主要是新用户进行注册的过程,首先用户进入到注册页面,填写注册信息并提交,如果无误的话系统会给予注册成功的提示,如果注册失败会提示注册失败信息。
用户登录用例:此功能模块针对的对象是本网站的会员既已经注册的会员,会员首先填写用户名和密码,然后点击登录按钮,如果网站数据库中存在此会员并且密码正确则提示登录成功提示,如果网站不存在此用户或密码不正确,系统会提示用户登录失败。
修改密码用例:此用例针对注册会员进行操作。
用户登录成功会可以进入网站主页面,如果用户想修改密码的话可以单击修改密码按钮,进行密码修改,用户输入新密码单击修改按钮即可完成密码修改。
显示系统功能用例:此功能针对注册会员,会员首先登录到网站,进入主页,主页会有相关操作的按钮,显示系统所提供给会员操作的功能,用户可以针对自己的需要选择系统提供的功能。
订货衣服用例:此功能针对注册登录会员,网站提供两种订购方案:单件订购和定制套装。
用户可以根据自己的需求来选择。
单件订购方案:用户选择是上衣还是裤子,并填写订购的数量,确认无误后单击订购按钮即可,如果订购成功,系统会提示订购成功,失败则会提示订购失败。
软件设计模式大作业样例
设计模式大作业课程名称:软件设计模式设计题目:公司经费申请院系:计算机科学与信息工程学院学生姓名:学号:专业班级:软件工程13-1指导教师:**2016年6月软件设计模式任务书目录一、系统目标 ...................................................................................... 错误!未定义书签。
1. 设计目的......................................................................................... 错误!未定义书签。
2. 需求描述......................................................................................... 错误!未定义书签。
二、系统模块选择 ............................................................................... 错误!未定义书签。
1. 需求分析......................................................................................... 错误!未定义书签。
2. 选用设计模式 (2)(1)模板方法模式 (2)(2)职责链模式......................................................................... 错误!未定义书签。
(3)观察者模式 (3)三、系统设计 (4)1. 系统功能模块设计 (4)四、系统实现 (5)1.模板方法模块及其实现类 (5)2.职责链模块及其实现类 (6)3.观察者模块及其实现类 (9)4.事件处理程序 (10)五、系统设计总结 (11)1. 实现的功能和优点 (11)2. 不足之处 (12)3. 完成心得 (12)六、参考文献 (12)参考文献 (12)一、系统目标1.设计目的通过本课程设计,加深对软件设计课程的理解,熟练掌握和巩固所学的各种设计模式,培养自我动手、查阅技术文献、资料、手册以及编写技术文献的能力。
设计模式大作业报告
《设计模式》课程大作业报告姓名:陈明专业:软件工程班级:1202日期:2015年5月29日西安欧亚学院2014—2015学年第二学期考试试卷专业:软件工程 课程:设计模式 年级:12级完成一个综合项目程序,其中使用所学设计模式两个或者两个以上。
要求在文档中首先给出项目程序完成的功能或者解决的问题,然后详细说明模式使用的具体情况,即角色和相应程序代码。
文档赋分标准如下:1、程序功能阐述明确,分析清楚。
(15分)2、使用两种设计模式,使用得当,并给出相应的角色及程序代码,程序代码有恰当的注释。
(60分)3、文档格式正确,排版清晰。
(15分)4、如果使用超过两种设计模式,并且使用正确。
(10分)说明:以上总分为个人的期末成绩,本课程个人总成绩=平时成绩*40%+期末成绩*60%。
号_____________ 班级___________ 姓名________ 考场号____ 座位号____- -- - - - -- - - - - - - -- - - -- -- -密 ○- - - - - - - - - - - - - - -- - - -- -- - -封 ○- - - - - - - - - - - - -- - - --- - - -- -线 ○- - - - - - - - - - -- - - - -- - - - -- - - -- - - --用户和药店以及制药厂交互的例子一、程序功能描述工厂方法模式:为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,而不直接使用Drug的子类的构造方法直接创造对象。
因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。
抽象工厂模式:通过创建多个药品工厂的类,让用户可以和创建的对象的类进行脱耦,为用户提供多个相关的药品,方便用户联合使用它们,用户不需要知道药品具体的生产过程将“工厂方法模式”与“抽象工厂模式”相结合,实现用户和创建对象的类脱耦,并且为用户提供多个相关的对象。
设计模式大作业
设计模式大作业摘要:随着软件系统规模和复杂性的增加, 人们对软件的可靠性和生产效率也提出了更高的要求, 软件重用在当前比以往任何时候都显得重要. 设计模式是系统设计阶段的软件重用, 使得那些具有良好性能的设计方案可以在相似环境下被再次复用. 设计模式以文档的形式把面向对象的软件设计经验记录下来, 并予以系统的命名、解释和评价, 使开发人员在进行系统的设计与开发时, 可以使用别人的成功经验而不必为普通的、重复的问题重新设计解决方案,使设计者更容易理解其设计思路,能为自己的问题找到更合适的解决办法,帮助设计者更快更好地完成系统设计.1.设计模式简介设计模式是针对面向对象系统中重复出现的设计问题,提出一个通用的设计方案,并予以系统化的命名和动机解释。
它描述了问题,提出了解决方案,并指出在什么条件下使用该方案以及其效果。
该解决方案是解决该问题的一组精心安排的通用的类和对象,再经过定制和实现就可用来解决特定的上下文中的问题。
简单来说,设计模式就是一个常用的方案。
在我们的开发过程中经常会遇到一些相同或相近的问题,如果每次都寻找一个相应的解决办法&那么就会增加开发时间,降低开发效率。
为了节省时间&提高开发效率&就需要提供一些解决类似问题的,在应用中被证明可行的方案设计模式。
所以一个设计模式就是描述了一个被证明可行的方案,这些方案可以重用,有良好的伸缩性。
一般而言,一个设计模式有四个要素:1.模式名称2.问题。
3.解决方案。
4.效果。
2.设计模式的分类根据两条准则对模式进行分类,范围准则和目的准则。
范围准则,即指定设计模式主要是用于类还是用于对象。
设计模式为:(1)类设计模式:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来了。
(2)对象设计模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。
从某种意义上来说,几乎所有设计模式都使用继承机制,所以“类设计模式”只指那些集中于处理类间关系的设计模式,而大部分设计模式都属于对象设计模式的范畴。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计模式大作业
学生:吴鹏丽班级:软测2班学号:20132110010303 序号:2-01 问题1. 请简述什么是里氏代换原则? (5分)
严格定义:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
通俗的定义:所有引用基类的地方必须能透明地使用其子类的对象。
问题2. 阅读以下代码,并回答问题:(7分)
(1)以上代码设计是否符合里氏代换原则?
答:不符合。
(2) 若你认为符合,请简要说明理由;若你认为不符合,也请简要说明理由。
因为类MyOrderedAndSortedCollection继承MyOrderedCollection,但是在继承的同时为了增加新的排序功能,类MyOrderedAndSortedCollection并没有新写一个方法,而是直接重写了父类MyOrderedCollection的addElement()方法。
父类的非抽象方法,不应该被子类重写,重写了就会改变原来父类的方法,造成意想不到的结果。
问题3. 请简要描述在什么状况下,问题2中的代码会造成麻烦? (4分) 当按照顺序依次添加,第二个元素的值与按照升序对该整数列表进行排序后的第二个元素的值不一致的时候,问题2中的代码会造成麻烦。
问题4. 如果你想避免问题3中出现的麻烦,你会如何修改问题2中的代码设计以使得其遵守里氏代换原则? (4分)
方法增加一个MyCollectio.java的抽象类实现代码如下所示:
public abstract class MyCollection{
protected List<Integer> list = new ArrayList<>();
public abstract void addElement(Integer i);
public abstract Integer getElement(Integer index);
}
//子类继承父类,并且添加自己的扩展的方法
public class MyOrderedAndSortedCollection extends MyCollection {
@Override
public void addElement(Integer i) {
list.add(i);
Collections.sort(list);
}
@Override
public Integer getElement(Integer index) {
return list.get(index);
}
}
public class MyOrderedCollection extends MyCollection { protected List<Integer> list = new ArrayList<>();
@Override
public void addElement(Integer i) {
list.add(i);
}
@Override
public Integer getElement(Integer index) {
return list.get(index);
}
}
在LS中将PrintSecondElement方法修改如下:
public static void PrintSecondElement(MyCollection collection) {
System.out
.println("The second element is :" + collection.getElement(1));
}
}
运行结果是:分别输出5,10。