实验5软工1302011342阮翀资料Word格式文档下载.docx
《实验5软工1302011342阮翀资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验5软工1302011342阮翀资料Word格式文档下载.docx(12页珍藏版)》请在冰点文库上搜索。
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式模式的关键是将遍历集合的任务交给一个称作迭代器的对象。
适合使用迭代器模式的情景有:
●让用户访问一个集合中的对象,但不想暴露对象在集合中的存储结构。
●希望对遍历不同的集合提供一个统一的接口。
迭代器模式的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"
);
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("
结束向后遍历"
}
publicbooleanisLast(){
if(productName.length-1==index1){
returnfalse;
returntrue;
publicvoidprevious(){
if(isFirst()){
System.out.println(getPreviousitem());
}else{
System.out.println("
结束向前遍历"
publicbooleanisFirst(){
if(index2==1){
publicStringgetNextitem(){
inti=index1+1;
Stringstr="
第"
+i+"
个:
"
+productName[index1];
index1=index1+1;
returnstr;
publicStringgetPreviousitem(){
inti=index2;
index2=index2-1;
+productName[index2];
//具体集合
publicclassMyprodcutListextendsProductList{
publicMyprodcutList(StringproductsName[]){
super(productsName);
publicLteratorgetLtreator(){
returnnull;
//集合
publicabstractclassProductList{
privateStringproductsName[]=newString[10];
publicProductList(StringproductsName[]){
this.productsName=productsName;
for(inti=0;
intj=i+1;
productsName[i]="
Product"
+j;
}
publicString[]getProductsName(){
returnproductsName;
2.中介者模式
//具体同事
publicclassAmericaextendsCountry{
publicvoidgetMessage(Stringmessage){
System.out.println(message);
publicstaticvoidmain(Stringargs[]){
WTOwto=newWTO();
Chinacn=newChina();
Americaus=newAmerica();
wto.setChina(cn);
wto.setAmerica(us);
publicclassChinaextendsCountry{
//同事
publicclassCountry{
publicUnitedNationsun;
publicvoidsetUnitedNations(UnitedNationsun){
this.un=un;
};
publicvoiddedare(Stringmessage){
//中介
publicclassUnitedNations{
publicvoiddedare(Stringmessage,Countrycountry){
//具体中介
publicclassWTOextendsUnitedNations{
privateChinacn;
privateAmericaus;
publicvoidsetChina(Chinacn){
=cn;
cn.getMessage("
中国"
dedare("
cn);
publicvoidsetAmerica(Americaus){
this.us=us;
us.getMessage("
美国"
us);
if(country==cn)
中方提出抗议!
+message);
else
美方提出抗议!