设计模式-迭代器模式

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);



    }

}

 

 

 

实验结果:

 

 

 

 

 

 

 

 
 
 
 
posted @ 2022-04-23 17:17  临易  阅读(206)  评论(0编辑  收藏  举报