解决的问题
浏览器的浏览记录,需要遍历浏览记录,但是又不想暴露保存浏览结构的数据结构;
本质上也是数据的封装。
代码
BrowserHistory
:
package com.cong.designpattern.iterator;
import java.util.ArrayList;
import java.util.List;
public class BrowserHistory {
private List<String> urls;
public BrowserHistory () {
this.urls = new ArrayList<>();
}
public void push(String url) {
this.urls.add(url);
}
public String pop() {
if (this.urls.isEmpty()) return null;
int lastIndex = this.urls.size() - 1;
String lastUrl = this.urls.get(lastIndex);
this.urls.remove(lastIndex);
return lastUrl;
}
public Iterator getIterator() {
return new ListIterator(this);
}
public List<String> getUrls() {
return urls;
}
}
Iterator
:
package com.cong.designpattern.iterator;
public interface Iterator {
public boolean hasNext();
public void next();
public String current();
}
ListIterator
:
package com.cong.designpattern.iterator;
public class ListIterator implements Iterator{
private BrowserHistory browserHistory;
private int index = -1;
public ListIterator(BrowserHistory browserHistory) {
this.browserHistory = browserHistory;
}
@Override
public boolean hasNext() {
return index + 1 < browserHistory.getUrls().size();
}
@Override
public void next() {
index += 1;
}
@Override
public String current() {
if (index < browserHistory.getUrls().size()) return browserHistory.getUrls().get(index);
return null;
}
}
Test code:
BrowserHistory browserHistory = new BrowserHistory();
browserHistory.push("a");
browserHistory.push("b");
browserHistory.push("c");
Iterator iterator = browserHistory.getIterator();
while (iterator.hasNext()) {
iterator.next();
System.out.println(iterator.current());
}
UML
![](https://img.haomeiwen.com/i4633505/2ba44b2239202bba.png)
网友评论