实验5_软工1302_2013011342_阮翀

  • 格式:doc
  • 大小:141.00 KB
  • 文档页数:11

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

二、实验内容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.迭代器模式public class Application {public static void main(String args[]){String Name[] = new String[10] ;MyprodcutList list = new MyprodcutList(Name);MyLterator lterator = new MyLterator(list);for(int i=0;i<10;i++){lterator.previous();}System.out.print("\n");for(int i=0;i<10;i++){lterator.next();}}}//迭代器public interface Lterator {public void next();public boolean isLast();public void previous();public boolean isFirst();public String getNextitem();public String getPreviousitem();}//具体迭代器public class MyLterator implements Lterator{private String productName[] = new String[10];private int index1 = 0;//向后遍历private int index2 = productName.length;//向前遍历public MyLterator(ProductList list){this.productName = list.getProductsName();}@Overridepublic void next() {if(isLast()){System.out.println(getNextitem());}else{System.out.println(getNextitem());System.out.println("结束向后遍历");}}@Overridepublic boolean isLast() {if(productName.length-1 == index1){return false;}else{return true;}}@Overridepublic void previous() {if(isFirst()){System.out.println(getPreviousitem());}else{System.out.println(getPreviousitem());System.out.println("结束向前遍历");}}@Overridepublic boolean isFirst() {if(index2 == 1){return false;}else{return true;}}@Overridepublic String getNextitem() {int i = index1 + 1;String str = "第" + i + "个:" + productName[index1];index1 = index1 + 1;return str;}@Overridepublic String getPreviousitem() {int i = index2;index2 = index2 - 1;String str = "第" + i + "个:" + productName[index2];return str;}}//具体集合public class MyprodcutList extends ProductList{public MyprodcutList(String productsName[]) {super(productsName);}public Lterator getLtreator(){return null;}}//集合public abstract class ProductList {private String productsName[] = new String[10];public ProductList(String productsName[]){this.productsName = productsName;for(int i=0;i<10;i++){int j = i+1;productsName[i] = "Product" + j;}}public String[] getProductsName(){return productsName;}public Lterator getLtreator(){return null;}}2.中介者模式//具体同事public class America extends Country{public void getMessage(String message){ System.out.println(message);}}public class Application {public static void main(String args[]){WTO wto = new WTO();China cn = new China();America us = new America();wto.setChina(cn);wto.setAmerica(us);}}//具体同事public class China extends Country{public void getMessage(String message){System.out.println(message);}}//同事public class Country {public UnitedNations un;public void setUnitedNations(UnitedNations un){this.un = un;};public void dedare(String message){System.out.println(message);};public void getMessage(String message){System.out.println(message);};}//中介public class UnitedNations {public void dedare(String message, Country country) {}}//具体中介public class WTO extends UnitedNations {private China cn;private America us;public void setChina(China cn) { = cn;cn.getMessage("中国");dedare("中国",cn);}public void setAmerica(America us) { = us;us.getMessage("美国");dedare("美国", us);}public void dedare(String message, Country country) {if (country == cn)System.out.println("中方提出抗议!" + message);elseSystem.out.println("美方提出抗议!" + message);}}。