觀察者設計模式
課程大綱
一、 觀察者模式原理
1、觀察者模式定義:簡單的說觀察者模式定義了一個一對多的依賴關係,讓一個或者多個觀察者對象監察一個主題對象,這樣一個主題對象在狀態上的變化能夠通知所有的依賴於此對象的那些觀察者對象,使這些觀察者對象能夠自動更新。
二、 觀察者模式實現
1、 Subject(被觀察的對象接口)
(1)、規定ConcreteSubject的統一接口
(2)、每個Subject可以有多個Observer
2、ContreteSubject(具體被觀察對象)
(1)、維護所有具體觀察者的引用的列表
(2)、狀態發生改變時會通知所有註冊的觀察者
3、Observer(觀察者接口)
(1)、規定了ConcreteObserver的統一接口
(2)、定義了一個Update()方法,在被觀察者對象的狀態改變時會被調用。
4、ConcreteObserver(具體觀察者)
(1)、維護一個對ConcreteSubject的引用
(2)、特定狀態與ConcreteSubject同步
(3)、實現Observer接口,通過update()方法接收ConcreteSubject的通知。
三、 觀察者模式作用
1、 觀察者模式在被觀察者和觀察者對象之間建立一個抽象的耦合,被 觀察者角色所知道的只是一個具體觀察者列表。
2、 由於觀察者和被觀察者沒有緊密的耦合在一起,因此他們可以屬於不同的抽象化層次,如果被觀察者和觀察者都被扔到一起,那麼這個對象必然跨越抽象化和具體化層次。
3、 觀察者模式支持廣播通訊,被觀察者會向所有的登記過的觀察者發出通知。
代碼
觀察者接口
package com.guanchazhe;
/**
* 觀察者接口
* @author Administrator
*
*/
public interface Observer {
/**
* 觀察者更新信息的方法
* @param price
*/
void update(float price);
}
被觀察者接口
package com.guanchazhe;
/**
* 被觀察者接口
* @author Administrator
*
*/
public interface Subject {
/**
* 註冊一個觀察者
* @param o
*/
void registerObserver(Observer o);
/**
* 刪除觀察者
* @param o
*/
void deleteObserver(Observer o);
/**
* 通知觀察者(跟新信息)
* @param o
*/
void notifyObserver();
}
具體的被觀察者對象
package com.guanchazhe;
import java.util.Vector;
/**
* 具體的被觀察者
* @author Administrator
*
*/
public class Doll implements Subject{
//被觀察者維護的是一個觀察者對象的列表(集合裏面存放的都是觀察者對象)
private Vector<Observer> v = new Vector<Observer>();
private float price;//布娃娃的價格
public Doll(float price) {
this.price = price;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
//修改價格時,通知所有的觀察者
this.price = price;
notifyObserver();
}
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
v.add(o);
}
@Override
public void deleteObserver(Observer o) {
// TODO Auto-generated method stub
v.remove(o);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
//通知所有的觀察者和對象
for (Observer o : v) {
o.update(price);
}
}
}
具體的觀察者對象
package com.guanchazhe;
/**
* 具體的觀察者對象
* @author Administrator
*
*/
public class Person implements Observer{
private String name;
public Person(String name) {
this.name = name;
// TODO Auto-generated constructor stub
}
@Override
public void update(float price) {
// TODO Auto-generated method stub
System.out.println(name+"關注的娃娃 的價格已經更新爲:"+price);
}
}
測試類
package com.guanchazhe;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//創建一個被 觀察者對象
Doll doll = new Doll(3000);
//創建兩個觀察者對象
Person p1 = new Person("小白");
Person p2 = new Person("小黑");
//註冊成爲觀察者
doll.registerObserver(p1);
doll.registerObserver(p2);
System.out.println("第一輪促銷:");
doll.setPrice(2800);
System.out.println("第二輪促銷:");
doll.setPrice(2599);
System.out.println("第三輪促銷:");
doll.setPrice(1988);
doll.deleteObserver(p2);
System.out.println("第四輪促銷:");
doll.setPrice(1599);
}
}