面向对象系统分析和设计综合实验报告4_第1页
面向对象系统分析和设计综合实验报告4_第2页
面向对象系统分析和设计综合实验报告4_第3页
面向对象系统分析和设计综合实验报告4_第4页
面向对象系统分析和设计综合实验报告4_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验名称:实验4 设计模型实验2学期: 2017-2018 学年第二学期一、实验目的1熟练使用面向对象设计原则对系统进行重构;2熟练使用面向对象编程语言(JAVA或 C+)实现几种常见的设计模式,包括单例模式、策略模式、装饰模式和适配器模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。二、实验要求1. 选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;2. 结合实例,正确无误地绘制单例模式、策略模式、装饰模式和适配器模式的结构图;3. 实现单例模式、策略模式、装饰模式和适配器模式,代码运行正确无误。三、实验内容1. 现实生活中,居民身份证号码

2、具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将号码分配给居民, 如果之后因为遗失等原因补办时, 还是使用原来的身份证号码,不会产生新号码,现使用单例模式模拟该场景。1) 类图2) 实现代码:publicclassIdClient publicstaticvoidmain(Stringargs ) IdentityCardNo.getInstance();IdentityCardNo.getInstance();packageRefactoring1;publicclassIdentityCardNo privatestaticIdentityCardNoinstance;pr

3、ivateStringno;privateIdentityCardNo() publicstaticIdentityCardNo getInstance() if( instance=null) System.out .println(" 第一次办理身份证,分配新号码" );instance=new IdentityCardNo();instance.setNo("No6000654321");System.out .println(" 身份证号码为:" +instance.getNo();elseSystem.out .printl

4、n(" 重复办理身份证, 获取旧号码!" );returninstance;publicString getNo() returnno ;publicvoidsetNo(Stringno ) this. no =no;2. 每一麻将局都有两个骰子,因此骰子就应当是双例类。现使用多例模式模拟该场景。1) 类图2) 实现代码:importimportpublicclassDice privatestaticDiceprivatestaticDiceprivateDice() die1=new Dice();die2=new Dice();publicstaticDice get

5、Instance(if( whichOne= 1) returndie1 ;elsereturndie2 ;intwhichOne ) publicsynchronizedintdice() Dated =new Date();Random r =new Random( d.getTime();intvalue=r .nextInt();value= Math.abs ( value );value=value% 6;value+= 1;returnvalue ;public class DiceClient private static Dice die1, die2;public stat

6、ic void main(String args) die1 = Dice.getInstance(1);die2 = Dice.getInstance(2);第一骰子骰出 : " + die1.dice();第二骰子骰出 : " + die2.dice();3. 某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票 (MovieTicket) 打折 (Discount) 方式,具体打折方案如下:学生凭学生证可享受票价8 折优惠;年龄在10 周岁及以下的儿童可享受每张票减免10 元的优惠(原始票价需大于等于20 元);影院 VIP 用户

7、除享受票价半价优惠外还可进行积分,影院赠送的奖品。该系统在将来可能还要根据需要引入新的打折方式。试使用策略模式设计并编程模拟实现该影院售票系统。1) 类图积分累计到一定额度可换取电2) 实现代码:publicinterfaceDiscount publicdoublecalculate(doubleprice);publicclassMovieTicket privatedoubleprice;privateDiscountdiscount;publicvoidsetPrice(doublethis. price=price;/ 维持一个对抽象折扣类的引用price) / 注入一个折扣类对象p

8、ublicvoidsetDiscount(Discountdiscount) this. discount=discount;publicdoublegetPrice() / 调用折扣类的折扣价计算方法returndiscount.calculate(this. price);/VIP会员票折扣类:具体策略类publicclassVIPDiscountimplementsDiscount publicdoublecalculate(doubleprice) System.out .println("VIP票: " );System.out .println(" 增

9、加积分! " );returnprice* 0.5;/ 学生票折扣类:具体策略类publicclassStudentDiscountpublicdoublecalculate(System.out .println(returnprice* 0.8;implementsdoubleprice" 学生票: " );Discount ) / 儿童票折扣类:具体策略类publicclassChildrenDiscountimplementsDiscount publicdoublecalculate(doubleprice) System.out .println(&q

10、uot; 儿童票: " );returnprice- 10;publicclassMoviceClient publicstaticvoidmain(Stringargs ) MovieTicketmt =new MovieTicket();doubleoriginalPrice= 60.0;doublecurrentPrice;mt.setPrice(originalPrice);System.out .println(" 原始价为: " +originalPriceSystem.out .println("-"););Discountdis

11、count= new VIPDiscount();/vip用户mt.setDiscount(discount ); /注入折扣对象currentPrice=mt.getPrice();System.out .println(" 折后价为: " +currentPrice);discount= new StudentDiscount();/ 学生用户mt.setDiscount(discount ); /注入折扣对象currentPrice=mt.getPrice();System.out .println(" 折后价为: " +currentPrice)

12、;discount= new ChildrenDiscount();/ 儿童用户mt.setDiscount(discount ); /注入折扣对象currentPrice=mt.getPrice();System.out .println(" 折后价为: " +currentPrice);3) 实现结果 :4. 某软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表1 所示:表 1 飞机种类及特征一览表飞机种类起飞特征飞行特征直升机 (Helicopter)垂直起飞 (VerticalTakeOff)亚音速飞行 (

13、SubSonicFly)客机 (AirPlane)长距离起飞 (LongDistanceTakeOff)亚音速飞行 (SubSonicFly)歼击机 (Fighter)长距离起飞 (LongDistanceTakeOff)超音速飞行 (SuperSonicFly)鹞式战斗机 (Harrier)垂直起飞 (VerticalTakeOff)超音速飞行 (SuperSonicFly)为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。1) 类图2) 实现代码:publicclassplane privatestatestate; / 状态publicvoidsettakeoff

14、Features(statetFeatures)this. state=tFeatures;publicvoidsetplanetype(Stringif ( type =" 直升机 " )state=new Helicopter();elseif ( type = " 客机 " )state=new AirPlane();type ) elseif ( type = " 歼击机 state =new Fighter();" )elseif ( type = " 鹞式战斗机 state =new Harrier();&quo

15、t; )elsestate=null;publicvoidtakeoff()state.takeOff();publicvoidfly()state.fly();publicclassAirPlaneimplementsstateOverridepublicString takeOff() System. out .println(" 长距离起飞return" 长距离起飞 " ;" );OverridepublicString fly() System. out .println(return" 亚音速飞行" ;" 亚音速飞

16、行" );publicclassFighterimplementsstateOverridepublicString takeOff() System. out .println(" 长距离起飞return" 长距离起飞 " ;" );OverridepublicString fly() System. out .println(return" 超音速飞行" ;" 超亚音速飞行" );publicclassHarrierimplements stateOverridepublicString takeOf

17、f() System.out .println(" 垂直起飞 " );return"垂直起飞 "OverridepublicString fly() System.out .println(" 超亚音速飞行 " );return" 超音速飞行 " ;publicclassHelicopterimplements stateOverridepublicString takeOff() System.out .println(" 垂直起飞 " );return"垂直起飞 "Ove

18、rridepublicString fly() System. out .println(" 亚音速飞行 " );return" 亚音速飞行 " ;publicinterfacestate publicString takeOff();/ 起飞publicString fly();/ 飞行publicclassClient publicstaticvoidmain(Stringargs ) planeplaneplaneplaneplane=new plane();.setplanetype(" 歼击机.takeoff();.fly();&qu

19、ot; );3) 实现结果:5. 儿子、妈妈、父亲三人合作画一幅画,儿子负责画出一朵花的轮廓,妈妈负责涂上颜色、父亲负责将画裱在画框里。现请使用装饰模式模拟这个过程。1) 类图2) 实现代码:publicinterfacepainting publicString Draw();publicclassSonimplementspaintingOverridepublicString Draw() System. out .println(" 儿子用笔画出了花的轮廓return" 儿子用笔画出了花的轮廓" ;" );publicclass private

20、public thisFatherimplementspaintingpaintingFather(painting. painting= paintingpainting; / 被装饰者painting) ;privatepublicFather() voidpaint() / 爸爸装饰者做的职责System.out .println(" 爸爸正在做上画框前的准备工作painting.Draw();/爸爸装饰者做职责System.out .println(" 父亲将画裱在画框里" );OverridepublicString Draw() System. out

21、 .println(" 父亲将画裱在画框里" );return" 父亲将画裱在画框里" ;" );publicclassprivateMother paintingimplements paintingpainting; / 被装饰者publicthisMother(painting. painting= paintingpainting;) privateMother() publicvoidpaint() System. out .println(" 妈妈正在做给画上颜色前的准备工作。painting.Draw();/ 妈妈装饰者

22、做的职责System. out .println(" 妈妈给画上好了颜色" );OverridepublicString Draw() System. out .println(" 妈妈给画上好了颜色" );return" 妈妈给画上好了颜色" ;" );publicclassClient publicstaticvoidmain(Stringpaintingpainting= new Son();painting.Draw();painting=new Mother(paintingpainting.Draw();pain

23、ting=new Father(paintingpainting.Draw();args ););3) 实现结果:6. 某公司想通过网络传输数据,但是担心文件被窃取。他们的所有数据都采用字符的方式传送。 现在他们开发了一个数据加密模块,可以对字符串进行加密, 以便数据更安全地传送。最简单的加密算法通过对字母向后移动6 位来实现, 同时还提供了稍复杂的逆向输出加密,还提供了更为高级的求模加密,让每一位与6 求模。用户先使用最简单的加密算法对字符串进行加密,再对加密之后的结果使用复杂加密算法进行二次加密, 再对二次加密结果用高级加密算法进行第三次加密。 现请使用装饰模式模拟这个过程。1) 类图2)

24、 实现代码:publicclassConcreteEncryptimplementsEncryptComponetprivateEncryptComponetencryptComponet;publicConcreteEncrypt(EncryptComponetencryptComponetsuper ();this. encryptComponet=encryptComponet;) publicvoid encrypt() encryptComponet.encrypt();publicinterfaceEncryptComponet publicabstractvoidencrypt(

25、);publicclassRawDataimplementsEncryptComponetpublicvoidencrypt() System.out .println(" 这是要发送的数据" );publicclassReversEncryptimplementspublicReversEncrypt(EncryptComponetEncryptComponetencryptComponet) addReservesEncrypt();privateSystem.voidaddReservesEncrypt() out .println(" 反向加密"

26、 );Overridepublicvoidencrypt() public class SuperEncrypt implements public SuperEncrypt(EncryptComponetEncryptComponetencryptComponet) addSuperEncrypt();privateSystem.voidaddSuperEncrypt() out .println(" 最高加密算法" );Overridepublicvoidencrypt() public class TranslateEncrypt implements public

27、TranslateEncrypt(EncryptComponetEncryptComponetencryptComponet) addTranslateEncrypt();privateSystem.voidaddTranslateEncrypt() out .println(" 移动加密 " );Overridepublicvoidencrypt() publicclass Client publicstaticvoidmain(Stringargs ) EncryptComponets0 , s1 , s2 , s3 ;s0=new RawData();s1=new T

28、ranslateEncrypt(s0 );s2=new ReversEncrypt(s1 );s3=new SuperEncrypt(s2 );s3 .encrypt();7. 现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如机器人叫喊方法cry()、机器人移动方法move()等。如果希望在不修改已有代码的基础上使得机器人能够像狗一样叫,像狗一样跑,使用适配器模式进行系统设计。1)类图2) 实现代码public interface public void public voidRobot cry();move();publicclassDog publicvoidba

29、rks()System. out .println(" 狗在叫" );publicvoidrun()System. out .println(" 狗在跑" );publicclassDogadapterOverridepublicvoidcry() barks();extendsDogimplementsRobotOverridepublicvoidmove() run();publicclassClient publicstaticvoidmain(Stringargs ) Dogadapterdogrobot=new Dogadapter();dog

30、robot.move();dogrobot.cry();3) 实现结果8. 在 NBA 作为外籍中锋,我需要翻译,具体场景描述如下:姚明刚来到 NBA,身材够高,球技够好;但是英语不是很懂,听不懂教练的战术安排;球员分为前锋、中锋和后卫;教练会给球员分配进攻、防守任务。现请使用适配器模式模拟这个场景。1) 类图2) 实现代码:publicabstractclassPlayerprotected String public Player(Stringname;name)this. name =name;publicpublicabstractabstractvoidattack();voidde

31、fense();publicclassGuardsextendsPlayerpublicGuards(Stringname)super ( name);publicvoidattack()System.out .println(" 后卫 " +name +" 进攻 " );publicvoiddefense()System.out .println("后卫" +name +" 防守" );publicclassCenterpublicCenter(StringextendsPlayername)super ( name);publicvoidattack()System.out .println(" 中锋 " +name +" 进攻 " )

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论