面向对象系统分析和设计综合实验报告4.docx
- 文档编号:26826773
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:25
- 大小:221.75KB
面向对象系统分析和设计综合实验报告4.docx
《面向对象系统分析和设计综合实验报告4.docx》由会员分享,可在线阅读,更多相关《面向对象系统分析和设计综合实验报告4.docx(25页珍藏版)》请在冰豆网上搜索。
面向对象系统分析和设计综合实验报告4
一、实验目的
1•熟练使用面向对象设计原则对系统进行重构;
2•熟练使用面向对象编程语言(JAVA或C++)实现几种常见的设计模式,包括单例模
式、策略模式、装饰模式和适配器模式,理解每一种设计模式的模式动机,掌握模式结构,学习如何使用代码实现这些模式。
二、实验要求
1.选择合适的面向对象设计原则对系统进行重构,正确无误地绘制重构之后的类图;
2.结合实例,正确无误地绘制单例模式、策略模式、装饰模式和适配器模式的结构图;
3.实现单例模式、策略模式、装饰模式和适配器模式,代码运行正确无误。
三、实验内容
1.现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第
一次申请身份证时将号码分配给居民,如果之后因为遗失等原因补办时,还是使用原来的身
份证号码,不会产生新号码,现使用单例模式模拟该场景。
办理轴证.4tE«r号码!
身滞证号为No6000654321■■办理身漁E,萩駅旧号码|JKfiE号硏■否一融?
true第一次号均
■二次号匕NO6000654321卉容華否翊拝:
true斤否孑相曰対It:
true
1)类图
0IdentityCardNo
©IdClient
•rrt占injjirq*Slrinq]]):
voiT
口inF日nt亡:
IdbritityCaindMci
dnc:
String
IdantityCardNoQ
申Cjetln^tdriuuO;lcjEnt】tyCa「dNaegetNof}:
String
€setNomoi^tring):
void
2)实现代码:
publicclassIdClient{
packageRefaetoringl;
instanee
publicclassIdentityCardNo{privatestaticIdentityCardNoprivateStringno;
privateIdentityCardNo(){
}
public
static
IdentityCardNogetInstance(){
if
(instanee
==null){
System.
out.println(”第一次办理身份证,分配新号码”);
instanee
=newIdentityCardNo();
instanee
.setNo("NO6000654321");
System.
out.println(”身份证号码为:
”+instanee.getNo());
}
else{
}
System.
out.println(”重复办理身份证,获取旧号码!
”);
returninstanee
publicStringgetNo(){
returnno;
no){
}
publicvoidsetNo(Stringthis.no=no;
2.每一麻将局都有两个骰子,因此骰子就应当是双例类。
现使用多例模式模拟该场景。
第一个殽子骰可的星「2
第二个骰子骰出的是:
5
1)类图importjava.util.Date;
2)实现代码:
importjava.util.Random;
publicclassDice{
privatestaticDicedie1=newDice();
privatestaticDicedie2=newDice();
privateDice(){
}
publicstaticDicegetInstance(intwhichOne){
if(whichOne==1){
returndie1;
}else{
returndie2;
}
}
publicsynchronizedintdice(){
Dated=newDate();
Randomr=newRandom(d.getTime());intvalue=r.nextInt();
value=Math.abs(value);
value=value%6;
value+=1;
returnvalue;
}
}
importjava.util.Random;
importjava.util.Date;
publicclassDiceClient{
privatestaticDicediel,die2;
publicstaticvoidmain(String[]args){
diel=Dice.getInstance
(1);
die2=Dice.getInstance
(2);
System.out.println(”第一骰子骰出:
"+die1.dice());
System.out.println(”第二骰子骰出:
"+die2.dice());
}
}
3.某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用
户提供不同的电影票(MovieTicket)打折(Discount)方式,具体打折方案如下:
学生凭学生证可享受票价8折优惠;
年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于
20元);
影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电
影院赠送的奖品。
该系统在将来可能还要根据需要引入新的打折方式。
试使用策略模式设计并编程模拟实现该影院售票系统。
1)类图
2)实现代码:
publicinterfaceDiscount{
publicdoublecalculate(doubleprice);}publicclassMovieTicket{
privatedoubleprice;
privateDiscountdiscount;//维持一个对抽象折扣类的引用
publicvoidsetPrice(doubleprice){
this.price=price;
}
//注入一个折扣类对象
publicvoidsetDiscount(Discountdiscount){
this.discount=discount;
}
publicdoublegetPrice(){
//调用折扣类的折扣价计算方法
returndiscount.calculate(this.price);
}
}//VIP会员票折扣类:
具体策略类
publicclassVIPDiscountimplementsDiscount{
publicdoublecalculate(doubleprice){
System.
System.
return
out.println("VIP票:
”);
out.println("增加积分!
”);
price*0.5;
}
//学生票折扣类:
具体策略类
mt=newMovieTicket();
originalPrice=60.0;
currentPrice;
mt.setPrice(originalPrice
System.
System.
out.println(”原始价为:
”+originalPrice
out.println(""
Discountdiscount=newVlPDiscount();〃vip用户
mt.setDiscount(discount);//注入折扣对象
currentPrice=mt.getPrice();
System.out.println(”折后价为:
”+currentPrice);
discount=newStudentDiscount();//学生用户
mt.setDiscount(discount);//注入折扣对象
currentPrice=mt.getPrice();
System.out.println(”折后价为:
”+currentPrice);
discount=newChildrenDiscount();//儿童用户
mt.setDiscount(discount);//注入折扣对象
currentPrice=mt.getPrice();
System.out.println(”折后价为:
”+currentPrice);
}
}
3)实现结果:
问Javadoc帼Declaration@Console涓
原始厉:
60.0
VI
増仙积分!
折后价为;30.0
学生票,
折后价为:
48.0
儿重票,
折后价为:
50.0
4.某软件公司欲开发一款飞机模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征,需要模拟的飞机种类及其特征如表1所示:
表1飞机种类及特征一览表
飞机种类
起飞特征
飞行特征
直升机(Helicopter)
垂直起飞(VerticalTakeOff)
亚音速飞行(SubSonicFly)
客机(AirPlane)
长距离起飞(LongDistanceTakeOff)
亚音速飞行(SubSonicFly)
歼击机(Fighter)
长距离起飞(LongDistanceTakeOff)
超音速飞行(SuperSonicFly)
鹞式战斗机(Harrier)
垂直起飞(VerticalTakeOff)
超音速飞行(SuperSonicFly)
为将来能够模拟更多种类的飞机,试采用策略模式设计并模拟实现该飞机模拟系统。
1)类图
・rra耳void
欢迎下载1:
16
0Plane
©AirFlan^
OState
•jtus(:
Featur«.:
void
2)实现代码:
publicclassplane{
tFeatures){
type){
privatestatestate;//状态publicvoidsettakeoffFeatures(statethis.state=tFeatures;
}
publicvoidsetplanetype(Stringif(type=="直升机”)state=newHelicopter。
;elseif(type=="客机"){state=newAirPlane();
}
elseif(type=="歼击机"){state=newFighter();
}
elseif(type=="鹞式战斗机"){state=newHarrier();
}
else{
state=null;
}
}
publicvoidtakeoff(){
state.takeOff();
}
publicvoidfly(){
state.fly();
}
}
publicclassAirPlaneimplementsstate{
@Override
publicStringtakeOff(){
System.out.println("长距离起飞");
return"长距离起飞”;
}
@Override
publicStringfly(){
System.out.println("亚音速飞行”);
return"亚音速飞行”;
}
}
publicclassFighterimplementsstate{
@Override
publicStringtakeOff(){
System.out.println("长距离起飞");return"长距离起飞”;
}
@Override
publicStringfly(){
System.out.println("超亚音速飞行");return"超音速飞行”;
}
}
publicclassHarrierimplementsstate{
@Override
publicStringtakeOff(){
System.out.println("垂直起飞");return"垂直起飞”;
}
@Override
publicStringfly(){
System.out.println("超亚音速飞行");
return"超音速飞行”;
}
}
publicclassHelicopterimplementsstate{
@Override
publicStringtakeOff(){
System.out.println("垂直起飞");
return"垂直起飞”;
@OverridepublicStringfly(){
System.
out.println("亚音速飞行"
return
"亚音速飞行";
}
}
public
interface
state{
publicStringtakeOff();//起飞
publicStringfly();//飞行
}
publicclassClient{
publicstaticvoidmain(Stringargs[]){
planeplane=newplane();
plane.setplanetype("歼击机”);
plane.takeoff();
plane.fly();
}
}
3)实现结果:
OConsole耳Ji.JUrtitItlServers
«terminated>Client[JavaApplication]D:
\ava
¥距离起
超亚音速飞行
5•儿子、妈妈、父亲三人合作画一幅画,儿子负责画出一朵花的轮廓,妈妈负责涂上颜色、父亲负责将画裱在画框里。
现请使用装饰模式模拟这个过程。
1)类图
OSon
0DrawQ:
String
欢迎下载
QMother
0Father
npainting:
painting
cfMotherfpainting:
painting)
—__
Opainting
7
°painting:
pointing
$Fatherfpainting:
paintingj
立
2)实现代码:
publicinterfacepainting{
publicStringDraw();
}
publicclassSonimplementspainting{
@Override
publicStringDraw(){
System.out.println(”儿子用笔画出了花的轮廓”);
return"儿子用笔画出了花的轮廓";
}
}
publicclassFatherimplementspainting{
privatepaintingpainting;//被装饰者publicFather(paintingpainting){
this.painting=painting;
}
privateFatherO{}
publicvoidpaint(){
//爸爸装饰者做的职责
System.out.println("爸爸正在做上画框前的准备工作”);
painting.Draw();//爸爸装饰者做职责
System.out.println(”父亲将画裱在画框里”);
}
@OverridepublicStringDraw(){
System.out.println(”父亲将画裱在画框里");
return"父亲将画裱在画框里”;
publicclassMotherimplementspainting{
privatepaintingpainting;//被装饰者
publicMother(paintingpainting){
this.painting=painting;
}
privateMother(){}
publicvoidpaint(){
System.out.println(”妈妈正在做给画上颜色前的准备工作。
”);
painting.Draw();//妈妈装饰者做的职责
System.out.println(”妈妈给画上好了颜色”);
}
@Override
publicStringDraw(){
System.
out.println("妈妈给画上好了颜色
}
return
"妈妈给画上好了颜色";
}public
classClient{
publicstaticvoidmain(String[]args){
painting
painting=newSon();
painting
.Draw();
painting
=newMother(painting);
painting
.Draw();
painting
=newFather(painting);
}
3)
painting
.Draw();}
实现结果:
貝ConsoleS3JJUnitiTiSrv色n
6.某公司想通过网络传输数据,但是担心文件被窃取。
他们的所有数据都采用字符的
方式传送。
现在他们开发了一个数据加密模块,可以对字符串进行加密,以便数据更安全地
传送。
最简单的加密算法通过对字母向后移动6位来实现,同时还提供了稍复杂的逆向输出
加密,还提供了更为高级的求模加密,让每一位与6求模。
用户先使用最简单的加密算法对字符串进行加密,再对加密之后的结果使用复杂加密算
现请使用装饰模式模
法进行二次加密,再对二次加密结果用高级加密算法进行第三次加密。
拟这个过程。
2)实现代码:
publicclassConcreteEncryptimplementsEncryptComponet{
privateEncryptComponetencryptComponet;
publicConcreteEncrypt(EncryptComponetencryptComponet){
super();
this.encryptComponet=encryptComponet;
}
publicvoidencrypt(){
encryptComponet.encrypt();
}
}
publicinterfaceEncryptComponet{
publicabstractvoidencrypt();
}
publicclassRawDataimplementsEncryptComponet{
publicvoidencrypt(){
System.out.println(”这是要发送的数据”);
}
}
publicclassReversEncryptimplementsEncryptComponet{
publicReversEncrypt(EncryptComponetencryptComponet){
addReservesEncrypt();
}
privatevoidaddReservesEncrypt(){
System.out.println(”反向加密”);
}
@Override
publicvoidencrypt(){
}
}
publicclassSuperEncryptimplementsEncryptComponet{
publicSuperEncrypt(EncryptComponetencryptComponet){
addSuperEncrypt();
}
privatevoidaddSuperEncrypt(){
System.out.println(”最高加密算法”);
}
@Override
publicvoidencrypt(){
}
}
publicclassTranslateEncryptimplementsEncryptComponet{
publicTranslateEncrypt(EncryptComponetencryptComponet){
addTranslateEncrypt();
}
privatevoidaddTranslateEncrypt(){
System.out.println(”移动加密”);
}
@Override
publicvoidencrypt(){
}
}
publicclassClient{
publicstaticvoidmain(String[]args){
EncryptComponets0,s1,s2,s3;
s0=newRawData();
s1=newTranslateEncrypt(s0);
s2=newReversEncrypt(s1);
s3=newSuperEncrypt(s2);
s3.encrypt();
}
}
7.现需要设计一个可以模拟各种动物行为的机器人,在机器人中定义了一系列方法,如
机器人叫喊方法cry()、机器人移动方法move()等。
如果希望在不修改已有代码的基础上使
得机器人能够像狗一样叫,像狗一样跑,使用适配器模式进行系统设计。
0Dog
<—
0R.obot
QbarksQ:
void
•runQ:
void
•匸ryO;void
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 系统分析 设计 综合 实验 报告