1,定義:java
Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.(定義對象間一種一對多的關係,使得每當一個對象發生變化,全部依賴他的對象都會獲得通知)code
2,通用類圖server
3,例子對象
(1)接口
/** 觀察者接口 **/ public interface Observe { public String doSometing(); } /** 第一個觀察者 **/ public class Observer implements Observe{ public String doSometing() { return "i dont know"; } } /** 第二個觀察者 **/ public class Observer2 implements Observe{ public String doSometing() { return "i dont know 2"; } } /** 抽象主題角色 **/ public abstract class Subject { Vector<Observe> vector = new Vector<Observe>(); public void addObserve(Observe observe){ vector.add(observe); } public void remove(Observe observe){ vector.remove(observe); } public void notifyObserve(){ for(Observe observe:vector){ System.out.println(observe.doSometing()); } } } /** 主題實現 **/ public class Subjecter extends Subject{ public void doingSomething(){ super.notifyObserve(); } }
(2)jdk自帶rem
/** 觀察者 **/ public class Observe implements Observer{ public void update(Observable o, Object object) { System.out.println("觀察者數量:"+o.countObservers()+ "我被通知到了" + "" + object.toString()); } } /** 被觀察者接口 **/ public interface Subject{ public void doSomeThing(); } /** 被觀察者實現類 **/ public class Subjecter extends Observable implements Subject{ public void doSomeThing() { setChanged(); super.notifyObservers("啊啊"); } } /** 使用 **/ public static void main(String[] args){ Subjecter subject = new Subjecter(); Observer observer = new Observe(); subject.addObserver(observer); subject.doSomeThing(); }
4,觀察者模式角色it
1 抽象主題(Subject):它把全部觀察者對象的引用保存到一個彙集裏,每一個主題均可以有任何數量的觀察者。抽象主題提供一個接口,能夠增長和刪除觀察者對象。class
2 具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給全部登記過的觀察者發出通知。jdk
3 抽象觀察者(Observer):爲全部的具體觀察者定義一個接口,在獲得主題通知時更新本身。object
4 具體觀察者(ConcreteObserver):實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題狀態協調。