• 《图解设计模式》读书笔记1-1 Iterator模式


    迭代器模式的类图

    类图的解释

    名称 说明
    Aggregate 集合接口,有提供迭代器的方法
    Iterator 迭代器接口,提供迭代操作
    BookShelf 书架类
    Book 书类
    BookShelfIterator 书架类的迭代器

    迭代器模式的代码

    //集合接口
    public interface Aggregate {
        //生成迭代器的方法
        public abstract Iterator iterator();
    }
    
    //迭代器接口
    public interface Iterator {
        public abstract boolean hasNext();
        public abstract Object next();
    }
    
    //书架类
    public class BookShelf implements Aggregate {
        private Book[] books;
        private int last = 0;
        public BookShelf(int maxSize) {
            this.books = new Book[maxSize];
        }
        public Book getBookAt(int index) {
            return this.books[index];
        }
        public void appendBook(Book book) {
            this.books[last] = book;
            last++;
        }
        public int getLength() {
            return last;
        }
        //获得BookShelf迭代器
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    }
    
    //书类
    public class Book {
        private String name;
        public Book(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    //书架迭代器类
    public class BookShelfIterator implements Iterator {
        private BookShelf bookShelf;
        private int index;
        public BookShelfIterator(BookShelf bookShelf) {
            this.bookShelf = bookShelf;
            this.index = 0;
        }
        public boolean hasNext() {
            if (index < bookShelf.getLength()) {
                return true;
            } else {
                return false;
            }
        }
        public Object next() {
            Book book = bookShelf.getBookAt(index);
            index++;
            return book;
        }
    }
    
    
    //测试方法
    public static void main(String[] args) {
            BookShelf bookShelf = new BookShelf(4);
            bookShelf.appendBook(new Book("西游记"));
            bookShelf.appendBook(new Book("红楼梦"));
            bookShelf.appendBook(new Book("水浒传"));
            bookShelf.appendBook(new Book("三国演义"));
    
            Iterator iterator = bookShelf.iterator();
            while (iterator.hasNext()) {
                Book book = (Book)iterator.next();
                System.out.println(book.getName());
            }
    }
    

    解释

    • BookShelf相当于一个Book的集合,Aggregate接口相当于“集合操纵工具”的工具箱,BookShelf实现了Aggregate接口,就可以从工具箱里面取出集合操纵工具。

    • Iterator是集合的遍历工具,BookShelfIterator实现Iterator接口,就拥有了遍历集合的能力,经过特殊化修改,成为专门遍历BookShelf的工具。

    • 这样,我们就可以从BookShelf中取得Book集合遍历工具BookShelfIterator,使用它遍历这个BookShelf了。

    原因

    • 既然是遍历一个集合,直接写一个for循环不就行了,为什么要搞这么麻烦?

    • 因为:集合可以是一个数组,也可以是一个Vector,还可以是一个list,每种的遍历方式都不一样。如果要把数组换成list来用,那么整套代码都得重写。而用了迭代器模式后,只需要改变具体的迭代方法的实现即可。

    思想

    • 将通用的方法与具体的实现分离。

    • 弱化类之间的耦合,使类作为组件更容易被复用。

    • 尽量避免用具体的类来编程,优先使用抽象类和接口。

    • 说白了,写代码不要写的太具体,要抽象些...改着也好改。

  • 相关阅读:
    lxml.etree 教程5:Using XPath to find text
    .Net程序员学习Linux最简单的方法
    海南航空宁波到重庆的"变态"机票
    《帮我买单》帮我买单的故事
    VS 2005 Beta2 Team版正在下载中
    安家博客园
    标记:Oracle里面的过程两种参数的不同
    今天搞VS 2005搞了半天没真正搞出个什么名堂来
    Oracle中INSTR方法
    今天可算把VS 2005 Beta2安装上了,赶紧体会体会
  • 原文地址:https://www.cnblogs.com/qianbixin/p/10992670.html
Copyright © 2020-2023  润新知