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
2 {
3 public Iterator iterator();
4 }
5
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
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 }
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
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
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
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
1
public
interface
Iterator
2 {
3 public boolean hasNext();
4 public Object next();
5 public Object previous();
6 }
MainBook.java
2 {
3 public boolean hasNext();
4 public Object next();
5 public Object previous();
6 }
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
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 :)