It’s a long time that I didn’t do something meaningful. Maybe because I am in happiness now. J Many time I spend with my GF, a little decadence J

Several days ago, I see the book about design pattern in JAVA. Now note one down. About iterator design.

Here is the UML:


The Aggregate.java

1 public   interface  Aggregate
2
{
3      public
 Iterator iterator();
4 }

5  
The Book.java
 1 public   class  Book
 2
{
 3      private  String name  =   ""
;
 4
    
 5      public
 Book(String name)
 6     
{
 7          this .name  =
 name;
 8     }

 9      public  String getName()
10     
{
11          return
 name;
12     }

13 }
The BookShelf.java
 1 public   class  BookShelf  implements  Aggregate
 2
{
 3      private
 Book[] books;
 4      private   int  last  =   0
;
 5      private   int
 maxlength;
 6      public  BookShelf( int
 max)
 7     
{
 8         books  =   new
 Book[max];
 9         maxlength  =
 max;
10     }

11     
12      public  Book getBookAt( int
 index)
13     
{
14          if (index < 0
)
15         
{
16             System.out.println( " The index is below zero! "
);
17              return   null
;
18         }

19          else   if (index > maxlength)
20         
{
21             System.out.println( " Ths index is too large! "
);
22              return   null
;
23         }

24          else    
25              return
 books[index];
26     }

27     
28      public   void
 appendBook(Book book)
29     
{
30         books[last ++ ] =
book;
31     }

32      public   int  getLength()
33     
{
34          return
 last;
35     }

36     
37      public   int
 getMaxLength()
38     
{
39          return
 maxlength;
40     }

41      public  Iterator iterator()
42     
{
43          return   new  BookShelfIterator( this
);
44     }

45 }

46     
47         
The BookShelfIterator.java
 1 public   class  BookShelfIterator  implements  Iterator
 2
{
 3      private  BookShelf bookShelf;  // specific which shelf

 4      int  index;  // select the shelf and then the index,which book
 5     
 6      public
 BookShelfIterator(BookShelf bookShelf)
 7     
{
 8          this .bookShelf  =
 bookShelf;
 9         index  =   0
;
10     }

11     
12      public   boolean
 hasNext()
13     
{
14          if (index <
bookShelf.getLength())
15         
{
16              return   true
;
17         }

18          else
19          {
20              return   false
;
21         }

22     }

23     
24      public
 Object next()
25     
{
26          return  bookShelf.getBookAt(index ++
);
27     }

28     
29      public
 Object previous()
30     
{
31          return  bookShelf.getBookAt(index --
);
32     }

33 }

34         
The Iterator.java
1 public   interface  Iterator
2
{
3      public   boolean
 hasNext();
4      public
 Object next();
5      public
 Object previous();
6 }
MainBook.java
 1 public   class  MainBook
 2
{
 3      public   static   void
 main(String[] args)
 4     
{
 5         String[] newBooks  =   { " GNU Linux " , " GNU CC " , " QT " } ; // ,"Gnome"}; // ,"KDE"};    // for test larger,smaller and equal

 6         BookShelf bookShelf  =   new  BookShelf( 4 );
 7          boolean  flag  =   true
;
 8          int  i  =   0
;    
 9
        
10          while
(flag)
11         
{
12             bookShelf.appendBook( new  Book(newBooks[i ++
]));
13              if (bookShelf.getLength() == bookShelf.getMaxLength())   // the shelf is full

14              {
15                 flag  =   false
;
16                  break
;
17             }

18             
19              if (i == newBooks.length)      // new books traverse all 

20              {
21                  break
;
22             }

23         }

24          if (i < bookShelf.getMaxLength())              // the shelf is not full  the i starts from 1
25          {
26             System.out.println( " This shelf can hold  " +  bookShelf.getMaxLength() + "  books but there is only  " + newBooks.length + "  new incoming books! "
);
27         }

28          if ( ! flag)
29         
{
30             System.out.println( " There are  " + newBooks.length  + "  books but this shelf can hold  " +  bookShelf.getLength() + "  books now it's full! OK! "
);
31         }

32         
33         Iterator it  =
 bookShelf.iterator();
34          while
(it.hasNext())
35         
{
36             Book book  =
 (Book)it.next();
37             System.out.println( "" +
book.getName());
38              // book = (Book)it.previous();                       //
will cause dead loop
39              // System.out.println(""+book.getName());

40         }

41          // Book book = (Book)it.previous();                    // will cause error
42          // System.out.println(""+book.getName());

43     }

44 }

45

All codes are here, I want to say the comments the first previous() will cause dead loop

The second previous will cause error, because the next() returns the current value and point to the next, then invoke the previous(), it returns the current (now the current points to the one after the last) so an error is caused.

Some words:

Don’t write program use only specific class, the abstract and the interface is good.


Good Luck :)