今天刚开始看设计模式,顺便写一下以便记忆,如果有幸被那位大师看到,指点一下便是我的万幸了!
我对设计模式的理解很肤浅,就是方便代码的开发与后期维护修改。它可以让人清楚自己在干什么和将要干什么,而不是稀里糊涂的遇见一个问题解决一个问题。因为很多后期的问题都是在前期开发时不注意方法造成的。若没有一个良好的设计规范,很容易造成软件腐烂。
迭代器模式Iterator:
迭代器模式可以循环遍历数组或集合,而且可以使应用与实现相分离。下面介绍一个例子:
我们假设有一个Book类和BookShelf类,我们可以查看书架上有哪些书。
Book类:
package iterator;
public class Book {
private String name="";
public Book(String name){
this.name=name;
}
public String getName(){
return name;
}
}
BookShelf类:
package iterator;
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 books[index];
}
public void appendBook(Book book){
books[last]=book;
last++;
}
public int getLength(){
return last;
}
public Iterator iterator() {
// TODO Auto-generated method stub
return new BookShelfIterator(this);
}
}
其实到了这里我们完全可以写一个Main类来遍历书架上的书,但是如果那样的话代码的耦合度就太高了。如何是Main类中的调用不与实现挂钩呢?可以用Iterator。
Iterator接口:
package iterator;
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
}
Aggregate接口:
package iterator;
public interface Aggregate {
public abstract Iterator iterator();
}
我们可以定义一个具体的类来实现Iterator接口:
BookShelfIterator类:
package iterator;
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;
}
return false;
}
public Object next() {
Book book=bookShelf.getBookAt(index);
index++;
return book;
}
}
这样我们可以直接调用Interator中的遍历方法来遍历书架上的书,这就大大地降低了代码的耦合度。
下面是测试类:
Main类:
package iterator;
public class Main {
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("第四本书"));
// bookShelf.appendBook(new Book("第五本书"));
Iterator it=bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book) it.next();
System.out.println(book.getName());
}
}
}
至此整个程序结束。
但是要注意,我们在BookShelf类中用数组来放置书本,因数组空间一旦确定就不能改变在Main测试类中当你试图添加第五本书时,程序会抛出数组越界异常。因此我们最好改用Vector类或List接口的实现类来实现。
你可以将BookShelf类中的内容改为下面的代码:
package iterator;
import java.util.ArrayList;
import java.util.List;
public class BookShelf implements Aggregate{
private List<Book> books;
public BookShelf(int maxSize) {
this.books=new ArrayList<Book>(maxSize);
}
public Book getBookAt(int index){
return books.get(index);
}
public void appendBook(Book book){
books.add(book);
}
public int getLength(){
return books.size();
}
public Iterator iterator() {
// TODO Auto-generated method stub
return new BookShelfIterator(this);
}
}
现在你可以放心的在Main类中多添加一些书本而不会再报数组越界异常。