• 设计模式之——迭代器模式


    设计模式是开发者前辈们给我们后背的一个经验总结。有效的使用设计模式,能够帮助我们编写可复用的类。所谓“可复用”,就是指将类实现为一个组件,当一个组件发生改变时,不需要对其他组件进行修改,或者只需要修改很小一部分即可。

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

    下面是一段实现了迭代器模式的示例程序,这段程序作用是,将书BOOK放到书架中BookShelf,并且采用迭代器的方式进行遍历,将书名按照顺序显示出来:

    • Aggregate接口,作为自定义集合的顶层接口。
    package site.wangxin520.gof.iterator;
    
    /**
     * 定义表示集合的接口,有一个iterator方法,用于返回一个Iterator类
     * @author wangXgnaw
     *
     */
    public interface Aggregate {
        
        /**
         * 集合的获取迭代器方法,用于返回一个迭代器对象
         * @return Iterator 返回一个迭代器对象
         */
        public Iterator iterator();
    }
    • Iterator迭代器的顶层父接口
    package site.wangxin520.gof.iterator;
    
    /**
     * 这个是迭代器的类,里面有两个方法,hasnext和next
     * @author wangXgnaw
     *
     */
    public interface Iterator {
        
        /**
         * 判断是否有下一个元素,通常使用在while进行遍历
         * @return boolean 
         */
        public boolean hasNext();
        
        /**
         * 返回当前指针指向的元素,并且把指针指向下一个元素
         * @return Object 返回一个对象,集合的单个元素对象
         */
        public Object next();
    }
    • BookShelf书架的类,实现了集合的接口
    package site.wangxin520.gof.iterator;
    
    import java.util.ArrayList;
    
    /**
     * 用于表示书架用的类,实现了集合的这个接口。 实际在Java中,集合的顶层接口也是同样的方式。
     * 
     * @author wangXgnaw
     *
     */
    public class BookShelf implements Aggregate {
    
        /**
         * 集合,用于保存书的
         */
        private ArrayList<Book> list = new ArrayList<Book>();
    
        /**
         * 获取到书架的大小
         * 
         * @return int
         */
        public int size() {
            return list.size();
        }
    
        /**
         * 往书架里面放书
         * @param book
         */
        public void putBook(Book book) {
            list.add(book);
        }
    
        /**
         * 根据序号,从书架里面取书
         * 
         * @param index
         * @return Book
         */
        public Book getBook(int index) {
            return list.get(index);
        }
    
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    
    }
    • 书架的迭代器实现,这需要自己定义,以实现迭代器接口定义的方法。
    package site.wangxin520.gof.iterator;
    
    /**
     * 书架的一个迭代器
     * @author wangXgnaw
     *
     */
    public class BookShelfIterator implements Iterator{
    
        /**
         * 书架属性,用于对迭代器进行操作需要的。
         */
        private BookShelf bookShelf;
        
        /**
         * 当前指针指向的位置
         */
        private int index=0;
        
        /**
         * 书架类迭代器的构造函数
         * @param bookShelf
         */
        public BookShelfIterator(BookShelf bookShelf){
            this.bookShelf=bookShelf;
        }
    
        public boolean hasNext() {
            if(index<bookShelf.size()){
                return true;
            }
            return false;
        }
    
        public Object next() {
            //获取指定编号的书
            Book book = bookShelf.getBook(index);
            //指针向下移动一个
            index++;
            return book;
        }    
        
    }
    • Book书的实体类
    package site.wangxin520.gof.iterator;
    
    /**
     * 书的实体类
     * @author wangXgnaw
     *
     */
    public class Book {
        /**
         * 数的名字
         */
        private String bookName;
    
        /**
         * 书本的构造函数,传入书本的名字。
         * @param name
         */
        public Book(String name){
            this.bookName=name;
        }
        
        public String getBookName() {
            return bookName;
        }
    
        public void setBookName(String bookName) {
            this.bookName = bookName;
        }
    
        
    }
    • 测试方法
    package site.wangxin520.gof.iterator;
    
    /**
     * 迭代器模式的测试方法
     * @author wangXgnaw
     *
     */
    public class IteratorTest {
        public static void main(String[] args) {
            //获得一个书柜
            BookShelf bs=new BookShelf();
            //往书柜里面放书
            bs.putBook(new Book("红楼梦"));
            bs.putBook(new Book("西游记"));
            bs.putBook(new Book("三国演义"));
            bs.putBook(new Book("水浒传"));
            
            //使用迭代器,依次获取到书柜中书的名字
            Iterator iterator = bs.iterator();
            while (iterator.hasNext()) {
                Book nextBook = (Book) iterator.next();
                String bookName = nextBook.getBookName();
                System.out.println(bookName);
            }
        }
    }
    • 最后的结果:

    image

  • 相关阅读:
    【判环】Perpetuum Mobile
    【计算几何】Water Testing
    【动态规划】Überwatch
    【规律】Cunning Friends
    【转载】【最短路Floyd+KM 最佳匹配】hdu 2448 Mining Station on the Sea
    【动态规划】Concerts
    【计算几何】The Queen’s Super-circular Patio
    【规律】Farey Sums
    【规律】Growing Rectangular Spiral
    Mancala II
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7594357.html
Copyright © 2020-2023  润新知