1. 迭代器模式的运用
(1)案例背景: 课堂教学中学习了如何使用迭代器模式来模拟电视遥控器的实现,并使用了内部类的方式来实现迭代 器。在实验中,请将迭代器从具体聚合类(电视机类)中分离出来,重新实现电视遥控器的模拟,请画出 类图并编程实现。
(2)实现步骤: Ø 参照教材中实例,画出电视机遥控器的类图 Ø 根据类图,实现上述类的具体代码以及用户类 Client,请注意将迭代器分离出来,形成单独 的类,此外还需要实现 XMLUtil 类来从 XML 配置文件中读取具体的电视遥控器类。 Ø 编译并运行代码,实现电视遥控器的模拟。 软件详细设计 R 实验指导书 2
(3)案例总结: 在以下情况下可以使用迭代器模式: Ø 需要访问一个聚合对象的内容而无需暴露它的内部表示时 Ø 需要为一个聚合对象提供多种遍历方式时 Ø 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不 同的遍历方式,而客户端可以一致性地操作该接口。
代码结构:
详细代码:
TVIterator.java:
package Iterator.Iterator;
public interface TVIterator {
void setChannel(int i);
void next();
void previous();
boolean isLast();
Object currentChannel();
boolean isFirst();
}
Television.java:
package Iterator.Aggregate;
import Iterator.Iterator.TVIterator;
public interface Television {
TVIterator createIterator();
}
abstractIterator.java:
package Iterator.ConcreateIterator;
import Iterator.Iterator.TVIterator;
public class abstractIterator implements TVIterator {
public Object[] obj;
private int currentIndex = 0 ;
// public void abstractIterator(Object[] obj) {
// this.obj = obj;
// int currentIndex = 0 ;
// }
public void next(){
if (currentIndex < obj.length){
currentIndex++;
}
}
public void previous(){
if (currentIndex > 0){
currentIndex--;
}
}
public void setChannel(int i){
currentIndex = i;
}
public Object currentChannel(){
return obj[currentIndex];
}
public boolean isLast(){
return currentIndex == obj.length;
}
public boolean isFirst(){
return currentIndex == 0;
}
}
SkyTV.java:
package Iterator.ConcreateIterator;
import Iterator.Aggregate.Television;
import Iterator.Iterator.TVIterator;
public class SkyTV extends abstractIterator implements Television {
public Object[] obj = {"CCTV1","CCTV2","CCTV3","CCTV4"};
public TVIterator createIterator(){
return this;//return new SkyTV();
}
public SkyTV() {
super.obj = obj;
}
// public TVIterator createIterator(){
// return new SkyIterator();
// }
//
// private class SkyIterator implements TVIterator {
// private int currentIndex = 0 ;
//
// public void next(){
// if (currentIndex < obj.length){
// currentIndex++;
// }
// }
//
// public void previous(){
// if (currentIndex > 0){
// currentIndex--;
// }
// }
//
// public void setChannel(int i){
// currentIndex = i;
// }
//
// public Object currentChannel(){
// return obj[currentIndex];
// }
//
// public boolean isLast(){
// return currentIndex == obj.length;
// }
//
// public boolean isFirst(){
// return currentIndex == 0;
// }
// }
}
TCLTV.java:
package Iterator.ConcreateIterator;
import Iterator.Aggregate.Television;
import Iterator.Iterator.TVIterator;
public class TCLTV extends abstractIterator implements Television {
private Object[] obj = {"湖南TV","北京TV","上海TV","山西TV"};
public TVIterator createIterator(){
return this;
}
public TCLTV() {
super.obj = obj;
}
// public TVIterator createIterator(){
// return new abstractIterator();
// }
}
XMLUtil.java:
package Iterator.Utils;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("src/Iterator/Utils/config.xml"));
//获取包含支付方式名称的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
Config.xml:
<?xml version="1.0" ?>
<config>
<className>Iterator.ConcreateIterator.SkyTV</className>
</config>
Client.java:
package Iterator.Client;
import Iterator.Aggregate.Television;
import Iterator.Iterator.TVIterator;
import Iterator.Utils.XMLUtil;
public class Client {
public static void display(Television tv) {
TVIterator i = tv.createIterator();
System.out.println("电视机频道:");
while (!i.isLast()){
System.out.println(i.currentChannel().toString());
i.next();
}
}
public static void reverseDisplay(Television tv){
TVIterator i = tv.createIterator();
i.setChannel(4);
System.out.println("逆向遍历电视机频道:");
while (!i.isFirst()){
i.previous();
System.out.println(i.currentChannel().toString());
}
}
public static void main(String[] args) {
System.out.println("详细设计实验报告 1904班白旭君 2019005368");
Television tv;
tv = (Television) XMLUtil.getBean();
display(tv);
System.out.println("----------------------------------");
reverseDisplay(tv);
}
}
实验结果:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128199.html