实验5软工1302011342阮翀.docx

上传人:b****5 文档编号:11899418 上传时间:2023-04-08 格式:DOCX 页数:11 大小:74.96KB
下载 相关 举报
实验5软工1302011342阮翀.docx_第1页
第1页 / 共11页
实验5软工1302011342阮翀.docx_第2页
第2页 / 共11页
实验5软工1302011342阮翀.docx_第3页
第3页 / 共11页
实验5软工1302011342阮翀.docx_第4页
第4页 / 共11页
实验5软工1302011342阮翀.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验5软工1302011342阮翀.docx

《实验5软工1302011342阮翀.docx》由会员分享,可在线阅读,更多相关《实验5软工1302011342阮翀.docx(11页珍藏版)》请在冰豆网上搜索。

实验5软工1302011342阮翀.docx

实验5软工1302011342阮翀

实验五迭代器模式、中介者模式的应用

一、实验目的

通过该实验,理解迭代器模式、中介者模式的意图、结构,在软件开发中使用这些模式并进行功能验证。

二、实验内容

1.某商品管理系统的商品名称存储在一个字符串数组中,现需要自定义一个双向迭代器实现对该商品名称数组的双向(前向和后向)遍历,绘制类图并编程实现。

可以参考图1类图,也可以自行设计。

图1商品名称遍历的类图

2.使用中介者模式来说明联合国的作用。

注:

可以将联合国定义为抽象中介者类,联合国下属机构如WTO、WHO等作为具体中介者类,国家作为抽象同事类,将中国、美国等国家作为具体同事类。

可以参考图2或自行设计。

图2联合国模拟类图

三、实验步骤与要求

1.对于以上题目要认真分析和理解题意,程序中要求使用相应的模式。

2.上机录入,使用JDK编译器调试、运行、验证程序。

3.请指导教师审查程序和运行结果并评定成绩;

4.撰写并上交实验报告。

四、实验原理:

1、迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

迭代器模式模式的关键是将遍历集合的任务交给一个称作迭代器的对象。

适合使用迭代器模式的情景有:

●让用户访问一个集合中的对象,但不想暴露对象在集合中的存储结构。

●希望对遍历不同的集合提供一个统一的接口。

迭代器模式的UML类图:

图3迭代器模式的类图

2、中介者模式

用一个中介对象来封装一系列的对象交互。

中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式的关键是将对象之间的交互封装在称作中介者的对象中,中介者使各对象不需要显示地相互引用,这些对象只包含中介者的引用。

适合使用中介者模式的情景有:

●许多对象以复杂的方式交互,所导致的依赖关系使系统难以理解和维护

●一个对象引用其他很多对象,导致难以复用该对象

中介者模式的UML类图:

图4中介者模式的类图

五、上机报告内容

1、班级、学号、姓名、实验完成日期;

2、实验题目;

3、设计方案:

给出你的设计方案,包括结构类图及相关说明;

4、源代码:

设计方案中各个类和接口的源代码,包括测试主类的源代码.

5、测试数据及运行结果

6、总结:

1)运用设计模式总结:

对所运用的设计模式的名称,分类,意图,结构,角色作用的总结,所运用的面向对象设计原则。

2)本次实验遇到的问题、如何解决的;本次实验的经验、体会、改进设想等。

六、实验成绩考核方法

实验成绩由出勤、实验完成情况以及实验报告综合评定。

考核成绩比例分配:

出勤占15%、实验完成情况占50%、实验报告占35%

七、上机安排

本实验共需2个学时。

总结

一、迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

   当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。

另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。

迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

迭代器模式(Iterator)就是分离了聚合对象的遍历行为,抽象出一个迭代器来负责这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部数据。

二、中介模式

在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。

一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。

一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。

可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

      中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。

对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。

滥用中介者模式,只会让事情变的更复杂。

∙ 抽象中介者:

定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。

一般包括一个或几个抽象的事件方法,并由子类去实现。

∙中介者实现类:

从抽象中介者继承而来,实现抽象中介者中定义的事件方法。

从一个同事类接收消息,然后通过消息影响其他同时类。

∙同事类:

如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。

在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。

同事类越多,关系越复杂。

并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。

在中介者模式中,同事类之间必须通过中介者才能进行消息传递。

附录:

(源代码)

1.迭代器模式

publicclassApplication{

publicstaticvoidmain(Stringargs[]){

StringName[]=newString[10];

MyprodcutListlist=newMyprodcutList(Name);

MyLteratorlterator=newMyLterator(list);

for(inti=0;i<10;i++){

lterator.previous();

}

System.out.print("\n");

for(inti=0;i<10;i++){

lterator.next();

}

}

}

//迭代器

publicinterfaceLterator{

publicvoidnext();

publicbooleanisLast();

publicvoidprevious();

publicbooleanisFirst();

publicStringgetNextitem();

publicStringgetPreviousitem();

}

//具体迭代器

publicclassMyLteratorimplementsLterator{

privateStringproductName[]=newString[10];

privateintindex1=0;//向后遍历

privateintindex2=productName.length;//向前遍历

publicMyLterator(ProductListlist){

this.productName=list.getProductsName();

}

@Override

publicvoidnext(){

if(isLast()){

System.out.println(getNextitem());

}else{

System.out.println(getNextitem());

System.out.println("结束向后遍历");

}

}

@Override

publicbooleanisLast(){

if(productName.length-1==index1){

returnfalse;

}else{

returntrue;

}

}

@Override

publicvoidprevious(){

if(isFirst()){

System.out.println(getPreviousitem());

}else{

System.out.println(getPreviousitem());

System.out.println("结束向前遍历");

}

}

@Override

publicbooleanisFirst(){

if(index2==1){

returnfalse;

}else{

returntrue;

}

}

@Override

publicStringgetNextitem(){

inti=index1+1;

Stringstr="第"+i+"个:

"+productName[index1];

index1=index1+1;

returnstr;

}

@Override

publicStringgetPreviousitem(){

inti=index2;

index2=index2-1;

Stringstr="第"+i+"个:

"+productName[index2];

returnstr;

}

}

//具体集合

publicclassMyprodcutListextendsProductList{

publicMyprodcutList(StringproductsName[]){

super(productsName);

}

publicLteratorgetLtreator(){

returnnull;

}

}

//集合

publicabstractclassProductList{

privateStringproductsName[]=newString[10];

publicProductList(StringproductsName[]){

this.productsName=productsName;

for(inti=0;i<10;i++){

intj=i+1;

productsName[i]="Product"+j;

}

}

publicString[]getProductsName(){

returnproductsName;

}

publicLteratorgetLtreator(){

returnnull;

}

}

2.中介者模式

//具体同事

publicclassAmericaextendsCountry{

publicvoidgetMessage(Stringmessage){

System.out.println(message);

}

}

 

publicclassApplication{

publicstaticvoidmain(Stringargs[]){

WTOwto=newWTO();

Chinacn=newChina();

Americaus=newAmerica();

wto.setChina(cn);

wto.setAmerica(us);

}

}

//具体同事

publicclassChinaextendsCountry{

publicvoidgetMessage(Stringmessage){

System.out.println(message);

}

}

//同事

publicclassCountry{

publicUnitedNationsun;

publicvoidsetUnitedNations(UnitedNationsun){

this.un=un;

};

publicvoiddedare(Stringmessage){

System.out.println(message);

};

publicvoidgetMessage(Stringmessage){

System.out.println(message);

};

}

//中介

publicclassUnitedNations{

publicvoiddedare(Stringmessage,Countrycountry){

}

}

//具体中介

publicclassWTOextendsUnitedNations{

privateChinacn;

privateAmericaus;

publicvoidsetChina(Chinacn){

=cn;

cn.getMessage("中国");

dedare("中国",cn);

}

publicvoidsetAmerica(Americaus){

this.us=us;

us.getMessage("美国");

dedare("美国",us);

}

publicvoiddedare(Stringmessage,Countrycountry){

if(country==cn)

System.out.println("中方提出抗议!

"+message);

else

System.out.println("美方提出抗议!

"+message);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1