定義:定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴它的對象都會得到通知並被自動更新。
實現: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從出版社獲取新書列表:
————————————————
白夜行
月亮與六便士
百年孤獨
————————————————