设计模式:Iterator--迭代器模式

迭代器模式

顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图:

 

MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,

iterator迭代模式,行为模式之一,他把容器包含的内部对象的访问委让给外部类,使用Iteartor(遍历)    按顺序进行遍历访问的设计模式

优点:1实现功能分离,简化容器接口,让容器只实现本身基本功能,把迭代功能委让给外部实现,符合类的设计原则

2 隐藏容器的具体实现细节
3 为容器或子容器提供一个统一的接口,一方面方便调用,另一方面使得调用者不必关注迭代具体实现
4 可以为容器或子容器实现不同的迭代方法或多个迭代方法
 

实例一


public class Book {
    private String ISBN;
    private String name;
    private double price;


    public Book(String ISBN, String name, double price) {
        this.ISBN = ISBN;
        this.name = name;
        this.price = price;
    }

    public String getISBN() {
        return ISBN;
    }

    public void setISBN(String ISBN) {
        this.ISBN = ISBN;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void dispaly(){
        System.out.println("ISBN="+ISBN+ ",name="+name+",price="+price);
    }

    @Override
    public String toString() {
        return "Book{" +
                "ISBN='" + ISBN + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}


public class BookList {

    private List<Book> bookList;
    private int index;

    public BookList() {
        bookList = new ArrayList<>();
    }

    //添加书籍
    public void addBook(Book book) {
        bookList.add(book);
    }

    //删除书籍
    public void  remoceBook(Book book) {
        int index = bookList.indexOf(book);
        bookList.remove(index);
    }

   /* //判断
    public boolean hasNext(){
        if(index >= bookList.size()) {
            return false;
        }
        return true;
    }

    //获取
    public Book getNext(){
        return bookList.get(index++);
    }


    public List<Book> getBookList() {
        return bookList;
    }*/


    /**
     * 提供获取一个迭代器
     * @return
     */
    public Iterator iterator() {
        return new Itr();
    }

    //内部类封装Iterator  迭代器模式  ,可以写不同的内部类,实现多个不同的迭代细节
    private class Itr implements  Iterator {
        @Override
        public boolean hasNext() {
            if(index >= bookList.size()) {
                return false;
            }
            return true;
        }

        @Override
        public Object next() {
            return bookList.get(index++);
        }

        @Override
        public void remove() {

        }
    }


}

测试:


    public static void main(String[] args) {
        BookList bookList = new BookList();
        Book b = new Book("010203","java从入门熬精通",90);
        Book b1 = new Book("010204","java虚拟机",70);

        bookList.addBook(b);
        bookList.addBook(b1);
        //没用iterator模式::方式一:让容器自己实现iterator顺序遍历
//        while(bookList.hasNext()) {
//            Book next = bookList.getNext();
//           next.dispaly();
//        }

        System.out.println("***********************");

        //没用iterator模式:方式二让调用者自己实现遍历
//        List<Book> bookList1 = bookList.getBookList();
//        for(Book book : bookList1){
//            book.dispaly();
//        }

        Iterator iterator = bookList.iterator();
        while(iterator.hasNext()) {
            Book next = (Book)iterator.next();
            next.dispaly();
        }


    }


测试结果:
***********************
ISBN=010203,name=java从入门熬精通,price=90.0
ISBN=010204,name=java虚拟机,price=70.0

代码实现二:


public interface Collection {

    public Iterator iterator();

    /*取得集合元素*/
    public Object get(int i);

    /*取得集合大小*/
    public int size();

}


**********************************************************

public interface Iterator {

    //前移
    public Object previous();

    //后移
    public Object next();

    //判断是否含有下一个
    public boolean hasNext();

    //取得第一个元素
    public Object first();

}


**********************************************************

public class MyCollection implements Collection {

    public String string[] = {"A","B","C","D","E"};
//    String arr[] = new String[5];
//    String arrr[] = new String[]{"A","B","C","D","E"};

    @Override
    public Iterator iterator() {
        return new MyIterator(this);
    }

    @Override
    public Object get(int i) {
        return string[i];
    }

    @Override
    public int size() {
        return string.length;
    }
}


**********************************************************



public class MyIterator implements Iterator {

    private Collection collection;
    private int index = -1;

    public MyIterator(Collection collection) {
        this.collection = collection;
    }

    @Override
    public Object previous() {
        if(index  > 0){
            index--;
        }
        return collection.get(index);
    }

    @Override
    public Object next() {
        if(index < collection.size()-1){
            index++;
        }
        return collection.get(index);
    }

    @Override
    public boolean hasNext() {
        if(index<collection.size()-1){
            return true;
        }else{
            return false;
        }
    }

    @Override
    public Object first() {
        index = 0;
        return collection.get(index);
    }
}
    

**********************************************************

 public static void main(String[] args) {
        Collection collection = new MyCollection();
        Iterator iterator = collection.iterator();
        while(iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }
    }


**********************************************************


测试结果:
A
B
C
D
E


**********************************************************

三、事例3

Department 院系

/**
 * @auhtor
 * @create 2023-02-07-14:37
 * 院系
 */
@Data
public class Department {

    private String name;

    private String desc;

    public Department(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
}

统一的对象 

public interface College {
    /**获取名称*/
    String getName();
    /**添加系*/
    void addDepartment(String name, String desc);
    /**获取迭代器*/
    Iterator createIterator();
}

ComputerCollege 计算机学院 

public class ComputerCollege implements College{

    private Department[] departments;
    int numOfDepartmetn = 0; // 保存当前数组的对象个数

    public ComputerCollege() {
        departments = new Department[5];
        addDepartment("Java专业","java");
        addDepartment("PHP专业","php");
        addDepartment("大数据专业","大数据");
    }

    @Override
    public String getName() {
        return "计算机学院";
    }

    @Override
    public void addDepartment(String name, String desc) {
        Department department = new Department(name, desc);
        departments[numOfDepartmetn] = department;
        numOfDepartmetn++;
    }

    @Override
    public Iterator createIterator() {
        return new ComputerIterator(departments);
    }
}

计算机学院的迭代器:遍历ComputerColege里面所有属性的迭代器 ComputerIterator 

public class ComputerIterator<E> implements Iterator {
    private E[] departments;
    int position = 0;

    public ComputerIterator(E[] departments) {
        this.departments = departments;
    }

    @Override
    public boolean hasNext() {
        if (position > departments.length || departments[position] == null) {
            return false;
        } else {
            return true;
        }
    }

    @Override
    public Object next() {
        E department = departments[position];
        position++;
        return department;
    }

    @Override
    public void remove() {

    }
}

信息工程学院 InfoCollege  

public class InfoCollege implements College {
    private List<Department> departments;

    public InfoCollege() {
        departments = new ArrayList<>();
        addDepartment("信息安全专业", "信息安全");
        addDepartment("网络安全专业", "网络安全");
        addDepartment("服务器安全专业", "服务器安全");
    }

    @Override
    public String getName() {
        return "信息工程学院";
    }

    @Override
    public void addDepartment(String name, String desc) {
        departments.add(new Department(name,desc));
    }

    @Override
    public Iterator createIterator() {
        return new InfoCollegeIterator(departments);
    }
}

信息工程学院的迭代器InfoCollegeIterator

public class InfoCollegeIterator<E> implements Iterator {
    // 信息工程以集合List形式存放系
    private List<E> departments;
    int index = 0;

    public InfoCollegeIterator(List<E> departments) {
        this.departments = departments;
    }

    @Override
    public boolean hasNext() {
        if (index >= departments.size()) {
            return false;
        }
        return true;
    }

    @Override
    public Object next() {
        E e = departments.get(index);
        index++;
        return e;
    }

    @Override
    public void remove() {

    }
}

输出main方法

public class OutputImpl {
    private List<College> colleges;

    public OutputImpl(List<College> colleges) {
        this.colleges = colleges;
    }

    public void printCollege() {
        // 遍历
        Iterator<College> iterator = colleges.iterator();
        while (iterator.hasNext()) {
            // 取出学院
            College next = iterator.next();
            System.out.println("==" + next.getName() + "==");
            printDepartment(next.createIterator());

        }
    }

    public void printDepartment(Iterator iterator) {
        while (iterator.hasNext()) {
            Department next = (Department) iterator.next();
            System.out.println(next.getName());
        }
    }
}

public class MainClient {
    public static void main(String[] args) {
        // 创建学院
        List<College> list = new ArrayList();
        College computerCollege = new ComputerCollege();
        College infoCollege = new InfoCollege();

        list.add(computerCollege);
        list.add(infoCollege);
        OutputImpl output = new OutputImpl(list);
        output.printCollege();

        
    }
}
// console 输出
==计算机学院==
Java专业
PHP专业
大数据专业
==信息工程学院==
信息安全专业
网络安全专业
服务器安全专业

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值