1.概念java
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。ide
2.適用性測試
(1).當一個抽象模型有兩個方面,其中一個方面依賴於另外一方面。 將這兩者封裝在獨立的對象中以使它們能夠各自獨立地改變和複用。 .net
(2).當對一個對象的改變須要同時改變其它對象,而不知道具體有多少對象有待改變。 server
(3)..當一個對象必須通知其它對象,而它又不能假定其它對象是誰。對象
3.參與者blog
(1).Subject(目標) 接口
目標知道它的觀察者。能夠有任意多個觀察者觀察同一個目標。 提供註冊和刪除觀察者對象的接口。 rem
(2).Observer(觀察者)get
爲那些在目標發生改變時需得到通知的對象定義一個更新接口。
(3).ConcreteSubject(具體目標)
將有關狀態存入各ConcreteObserver對象。 當它的狀態發生改變時,向它的各個觀察者發出通知。
(4).ConcreteObserver(具體觀察者)
維護一個指向ConcreteSubject對象的引用。 存儲有關狀態,這些狀態應與目標的狀態保持一致。 實現Observer的更新接口以使自身狀態與目標的狀態保持一致
4.示例:
package com.accp.Observer;
/**
* 主題(被觀察的東西)
* @author Administrator
*
*/
public interface Subject {
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
}
package com.accp.Observer;
/**
* 觀察者接口
* @author Administrator
*
*/
public interface Observer {
public void update();
}
package com.accp.Observer;
import java.util.ArrayList;
import java.util.List;
//具體觀察者
public class Cat implements Subject {
private List<Observer> list = new ArrayList<Observer>();
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
}
public void crawl() {
System.out.println("貓叫了...");
for(Observer ob : list) {
ob.update();
}
}
}
package com.accp.Observer;
/**
* 具體目標
* @author Administrator
*
*/
public class Mouse implements Observer {
public void runAway() {
System.out.println("老鼠逃跑了...");
}
@Override
public void update() {
runAway();
}
}
package com.accp.Observer;
public class Person implements Observer {
public void awake() {
System.out.println("人醒了...");
}
@Override
public void update() {
awake();
}
}
package com.accp.Observer;
/**
* 測試
* @author Administrator
*
*/
public class Test01 {
public static void main(String[] args) { Cat c = new Cat(); Person p = new Person(); Mouse m1 = new Mouse(); Mouse m2 = new Mouse(); c.addObserver(m1); c.addObserver(p); c.addObserver(m2); c.crawl(); } }