Java設計模式(八)觀察者模式 迭代器模式

(十五)觀察者模式

觀察者模式,定義對象間一對多關係,一個對象狀態發生改變,所有依賴於它的對象都收到通知並且自動更新,觀察者與被觀察者分開。例如郵件訂閱、RSS訂閱,如果有更新就會郵件通知你。

interface Observers{
	public void update();
}
class Observer1 implements Observers{
	public void update(){
		System.out.println("observer1 has received");
	}
}
class Observer2 implements Observers{
	public void update(){
		System.out.println("observer2 has received");
	}
}
interface Subject {
	public void add(Observers ob);
	public void delete(Observers ob);
	public void notifyObservers();
	public void operation();
}
abstract class AbstractSubject implements Subject{
	private Vector<Observers> vector = new Vector<>();
	public void add(Observers ob){
		vector.add(ob);
	}
	public void delete(Observers ob){
		vector.remove(ob);
	}
	public void notifyObservers(){
		Enumeration<Observers> enumo = vector.elements();
		while(enumo.hasMoreElements()){
			enumo.nextElement().update();
		}
	}
}
class MySubject extends AbstractSubject{
	public void operation(){
		System.out.println("update self");
		notifyObservers();
	}
}
public class Observer {
	public static void main(String[] args){
		Subject sub = new MySubject();
		sub.add(new Observer1());
		sub.add(new Observer2());
		sub.operation();
	}
}
(十六)迭代器模式

說到迭代器首先想到 Iterator ,使用迭代器來爲順序訪問集合元素提供一種方式。下面是自己的一個集合,當然只能放 int ,簡單的實現了 迭代器的功能,當然實際的Java迭代器比這要複雜很多。

interface Collection{
	public Iterator iterator();
	public Object get(int i);
	public int size();
	public void add(int n);
}
interface Iterator{
	public Object previous();
	public Object next();
	public boolean hasNext();
	public Object first();
}
class MyCollection implements Collection{
	private int count = 10;
	private int[] num = new int[count];
	public void add(int n){
		for(int i = 0;i < num.length;i++){
			if(num[i] == 0){
				num[i] = n;
				return;
			}
		}
	}
	public MyCollection(int count){
		this.count = count;
	}
	@Override
	public Iterator iterator() {
		return new MyIterator(this);
	}
	@Override
	public Object get(int i) {
		return num[i];
	}
	@Override
	public int size() {
		return num.length;
	}
}
class MyIterator implements Iterator{
	private Collection collection;
	private int pos = -1;
	public MyIterator(Collection collection){
		this.collection = collection;
	}
	@Override
	public Object previous() {
		if(pos > 0){
			pos--;
		}
		return collection.get(pos);
	}
	@Override
	public Object next() {
		if(pos < collection.size() - 1){
			pos ++;
		}
		return collection.get(pos);
	}

	@Override
	public boolean hasNext() {
		if(pos < collection.size() - 1){
			return true;
		}else{
			return false;
		}
	}

	@Override
	public Object first() {
		pos = 0;
		return collection.get(pos);
	}
	
}
public class IteratorTest {
	public static void main(String[] args){
		Collection col = new MyCollection(10);
		for(int i = 0 ; i < 10;i++){
			col.add(i * 23);
		}
		Iterator it = col.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章