我最近尝试用Java编写各种版本的Iterator和Observer Patterns,但目前我仍然坚持在一个项目中实现两者:
我想要完成的是迭代一个ArrayList,它包含类型的元素,并在每次迭代过程之后通知Observer有关更改和包含元素。 此外,我希望能够在单独的类
中选择迭代器的“类型”编辑:我终于完成了这个项目,希望这是“Observer Iterator”的正确版本,非常感谢有关如何改进代码的任何提示,但感谢everybodys鼓励的提示。
代码:
首先,Observer接口的helper类实现了update方法。每次迭代过程都会更改并打印出元素。
package iteratorObserver;
import java.util.List;
public class ConcreteObserver implements Observer{
@Override
public void update(String element) {
System.out.println("The current element is: " + element);
}
}
实际的Observer接口:
package iteratorObserver;
public interface Observer<E> {
void update(String element);
}
之后,使用ConcreteSubject和抽象类Subject进行相同的操作 观察者模式需要getState和setState,因此我将两者集成到下一个方法中。通过iterator.next获取元素以及设置它。
package iteratorObserver;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ConcreteSubject<E> extends Subject implements IteratorStandardFilter<E>{
List<String> listElements = new ArrayList<String>();
private int index;
private Iterator<E> iterator;
public ConcreteSubject(Iterator<E> iterator, List<String> listElements){
index = 0;
this.iterator = iterator;
this.listElements = listElements;
}
public void addElement(String element) {
listElements.add(element);
notifyObservers(element);
}
// check the size of the elements list and return if there are still
// elements left out
@Override
public boolean hasNext() {
if ((listElements.size() == index))
return false;
return true;
}
// iterate to the next element, not sure if it's overridden, since the
// actual next method of the iterator is still in use
@Override
public E next() {
E result = iterator.next();
index++;
notifyObservers((String) result);
return result;
}
}
主题类,仅用于标准观察者方法
package iteratorObserver;
import java.util.ArrayList;
import java.util.List;
public class Subject {
public List<Observer> listObservers = new ArrayList<Observer>();
public void addObserver(Observer observer){
listObservers.add(observer);
}
public void removeObserver(Observer observer){
listObservers.remove(observer);
}
public <E> void notifyObservers(String element){
for(Observer observerHelp : listObservers){
observerHelp.update(element);
}
}
}
由于我想添加各种过滤器,不仅是标准的列表迭代器,我添加了一个类IteratorStandardFilter,如下所示:
package iteratorObserver;
import java.util.Iterator;
public interface IteratorStandardFilter<E> extends Iterator<E> {
public boolean hasNext();
public E next();
}
最后,测试方法,主要:
package iteratorObserver;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class iteratorObserverMain {
public static void main(String [] args){
List<String> listElements = new ArrayList<String>();
listElements.add("hello");
listElements.add("there");
listElements.add("everybody");
listElements.add("it");
listElements.add("works");
listElements.add("Thanks for your help. Nice and encouraging forum");
Iterator<String> iterator = listElements.iterator();
ConcreteSubject<String> concreteSubject = new ConcreteSubject<String>(iterator, listElements);
concreteSubject.addObserver(new ConcreteObserver());
while(concreteSubject.hasNext()){
concreteSubject.next();
}
}
}