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 :)