设计模式-迭代器模式
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); } }
实验结果: