觀察者模式

定義:定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴它的對象都會得到通知並被自動更新。

實現:java.util包中提供的Observable類和Observer接口,可以用來實現觀察者模式。

注意:

1、觀察者與被觀察者要存在綁定addObserver(Observer os)。

2、被觀察者要在改變後,設置變化點setChanged(),併發出消息通知觀察者notifyObservers(),自動調用觀察者的update()方法。

3、注意參數的傳遞。

舉例:以出版社和讀者爲例子,發佈新書通知

public class Publish extends Observable{
	private ArrayList<String> bookList=new ArrayList<String>();
	
	public void addBook(String newBook){
		this.bookList.add(newBook);
		System.out.println("Publish新增書籍:"+newBook);
		//設置變化點
		this.setChanged();
		//通知觀察對象
		this.notifyObservers(newBook);
	}
	
	public void getNewbooklis(){
		System.out.println("————————————————");
		for (int i = 0; i < this.bookList.size(); i++) {
			System.out.println(bookList.get(i));
		}
		System.out.println("————————————————");
	}
}
public class Reader implements Observer {
	private String name;

	public Reader(String name) {
		this.name = name;
	}

	@Override
	public void update(Observable o, Object arg) {// 形參:o 被觀察者對象,arg 通知傳參
		if (arg instanceof String) {
			Publish publish = (Publish) o;
			String newBook = (String) arg;
			System.out.println(this.name + "觀察到新書:" + newBook);
			System.out.println(this.name + "從出版社獲取新書列表:");
			publish.getNewbooklis();
			System.out.println();
		}
	}

	public static void main(String[] args) {
		Publish publish = new Publish();
		Reader reader1 = new Reader("讀者A");
		Reader reader2 = new Reader("讀者B");
		Reader reader3 = new Reader("讀者C");

		publish.addObserver(reader1);
		publish.addObserver(reader2);
		publish.addObserver(reader3);

		publish.addBook("白夜行");
		publish.addBook("月亮與六便士");
		publish.addBook("百年孤獨");

	}

}

運行結果:

Publish新增書籍:白夜行
讀者C觀察到新書:白夜行
讀者C從出版社獲取新書列表:
————————————————
白夜行
————————————————

讀者B觀察到新書:白夜行
讀者B從出版社獲取新書列表:
————————————————
白夜行
————————————————

讀者A觀察到新書:白夜行
讀者A從出版社獲取新書列表:
————————————————
白夜行
————————————————

Publish新增書籍:月亮與六便士
讀者C觀察到新書:月亮與六便士
讀者C從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
————————————————

讀者B觀察到新書:月亮與六便士
讀者B從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
————————————————

讀者A觀察到新書:月亮與六便士
讀者A從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
————————————————

Publish新增書籍:百年孤獨
讀者C觀察到新書:百年孤獨
讀者C從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
百年孤獨
————————————————

讀者B觀察到新書:百年孤獨
讀者B從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
百年孤獨
————————————————

讀者A觀察到新書:百年孤獨
讀者A從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
百年孤獨
————————————————

 

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