迭代ArrayList + Observer模式

时间:2016-08-11 18:31:01

标签: java loops design-patterns arraylist observer-pattern

我最近尝试用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();
        }

    }
}

0 个答案:

没有答案