**定義**:定義對象間一種一對多的依賴關系,使得每當一個對象改變狀態,則所有依賴于它的對象都會得到通知并被自動更新。
## 一般模式

Subject被觀察者
---|定義被觀察者必須實現的職責,它必須能夠動態的增加、取消觀察者,一般是抽象類或者實現類,完成管理觀察者并通知觀察者。
Observer觀察者
---|觀察者接到信息后,進行update操作
ConcreteSubject具體的被觀察者
---|定義被觀察者自己的業務邏輯,同時定義對那些事件進行通知
ConcreteObserver具體的觀察者
---|每個觀察者在接收到信息后的處理反應是不同的,各個觀察者有自己的處理邏輯。
~~~
public class ObserverTest {
public static void main(String[] args) {
//創建一個唄觀察者
ConcreteSubject con = new ConcreteSubject();
//創建一個觀察者
Observer observer = new ConcreteObserver();
//添加到被觀察者類中
con.addObserver(observer);
//完成某項任務,實現更新
con.doSomething();
}
}
/**
* 觀察者接口,所有觀察者要實現該接口。
* 實現方法, 處理不同的業務邏輯。
* @author admin
*
*/
interface Observer{
public void update();
}
/**
* 具體的觀察者實現類。
* @author admin
*
*/
class ConcreteObserver implements Observer{
@Override
public void update() {
System.out.println("觀察者接收到信息,去實現業務邏輯.......");
}
}
/**
* 被觀察者抽象類,
* 主要對觀察者的操作,增加、刪除、通知所有觀察者等方法。
* @author admin
*
*/
abstract class Subject{
//定義一個觀察者集合
private List<Observer> observerList = new ArrayList<Observer>();
//添加一個觀察者
public void addObserver(Observer o){
this.observerList.add(o);
}
//刪除一個觀察者
public void removeObserver(Observer o){
this.observerList.remove(o);
}
//通知所有的觀察者
public void notifyObserver(){
for(Observer o : observerList){
o.update();
}
}
}
/**
* 被觀察者的具體實現類,
* 當被觀察者完成某種操作以后,
* 觀察者會產生相應的更新操作
* @author admin
*/
class ConcreteSubject extends Subject{
public void doSomething(){
System.out.println("被觀察者完成操作....");
super.notifyObserver();
}
}
~~~
## 一個例子:
韓國的韓非子是一個十分重要的任務,因此他身邊被安插好多各個國家的間諜,來監視他的一舉一動。
當韓非子有任何的行動間諜都要做相應的變化。

~~~
public class ObserverT {
public static void main(String[] args) {
//創建一個被觀察者
HanFeiZi hfz = new HanFeiZi();
//創建一個李斯觀察者
IObserver lisi = new Lisi();
//創建一個序言觀察者
IObserver xuyan = new XuYan();
//添加觀察者..
hfz.addOberver(lisi);
hfz.addOberver(xuyan);
//韓非子吃飯..
hfz.haveBreakfast();
}
}
/**
* 被觀察者的接口類,
* 定義其日常的行為方法。
* @author admin
*
*/
interface IHanFeiZi{
//吃飯
void haveBreakfast();
//娛樂
void haveFun();
}
/**
* 被觀察者的接口類,
* 定義其對身邊間諜的增加、刪除、通知所有間諜的方法
* @author admin
*
*/
interface IObservable{
void addOberver(IObserver o);
void removeObserver(IObserver o);
void notifyObserver(String context);
}
class HanFeiZi implements IHanFeiZi,IObservable{
//定義一個監聽者集合
private List<IObserver> observerList = new ArrayList<IObserver>();
@Override
public void addOberver(IObserver o) {
this.observerList.add(o);
}
@Override
public void removeObserver(IObserver o) {
this.observerList.remove(o);
}
@Override
public void notifyObserver(String context) {
for(IObserver o : observerList){
o.update(context);
}
}
@Override
public void haveBreakfast() {
System.out.println("----韓非子開始吃飯了...");
this.notifyObserver("----韓非子在吃飯.....");
}
@Override
public void haveFun() {
System.out.println("----韓非子開始娛樂了...");
this.notifyObserver("----韓非子在娛樂.....");
}
}
/**
* 觀察者接口類,
* 實現該類的子類,對被觀察者的舉動進行相應的業務邏輯更新。
* @author admin
*
*/
interface IObserver{
public void update(String context);
}
/**
* 具體是觀察者實現類..
* @author admin
*/
class Lisi implements IObserver{
@Override
public void update(String context) {
System.out.println("李斯接收到消息,向皇帝報告:");
this.reportToBoss(context);
System.out.println("皇帝沒有責罰我,我很開心...");
}
private void reportToBoss(String info){
System.out.println("報告老板,"+info);
}
}
class XuYan implements IObserver{
@Override
public void update(String context) {
System.out.println("序言接收到消息,想丈夫匯報:");
this.reportToHasband(context);
System.out.println("序言表現很好..");
}
public void reportToHasband(String info){
System.out.println("報告老公:"+info);
}
}
~~~
## 觀察者模式 的擴展
---|java世界中的觀察者模式
java.util.Observer接口和java.util.Observable實現類
為我們提供了觀察者模式。
被觀察者只需要繼承Observable類,就可以實現對監聽者的添加、刪除、通知等方法,
觀察者只要實現Observer接口,就可以完成相應的更新操作。

~~~
public class ObserverT {
public static void main(String[] args) {
//創建一個被觀察者
HanFeiZi hfz = new HanFeiZi();
//創建一個李斯觀察者
Observer lisi = new Lisi();
//創建一個序言觀察者
Observer xuyan = new XuYan();
//添加觀察者..
hfz.addObserver(lisi);
hfz.addObserver(xuyan);
//韓非子吃飯..
hfz.haveBreakfast();
}
}
/**
* 被觀察者的接口類,
* 定義其日常的行為方法。
* @author admin
*
*/
interface IHanFeiZi{
//吃飯
void haveBreakfast();
//娛樂
void haveFun();
}
class HanFeiZi extends Observable implements IHanFeiZi {
@Override
public void haveBreakfast() {
System.out.println("----韓非子開始吃飯了...");
/*
* 如果 hasChanged 方法指示對象已改變,則通知其所有觀察者,
* 并調用 clearChanged 方法來指示此對象不再改變。
*/
super.setChanged();
super.notifyObservers("韓非子在吃飯...");
}
@Override
public void haveFun() {
System.out.println("----韓非子開始娛樂了...");
/*
* 如果 hasChanged 方法指示對象已改變,則通知其所有觀察者,
* 并調用 clearChanged 方法來指示此對象不再改變。
*/
super.setChanged();
super.notifyObservers("韓非子在娛樂...");
}
}
/**
* 具體是觀察者實現類..
* @author admin
*/
class Lisi implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("李斯接收到消息,向皇帝報告:");
this.reportToBoss(arg);
System.out.println("皇帝沒有責罰我,我很開心...");
}
private void reportToBoss(Object info){
System.out.println("報告老板,"+info);
}
}
/**
* 具體是觀察者實現類..
* @author admin
*/
class XuYan implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("序言接收到消息,想丈夫匯報:");
this.reportToHasband(arg);
System.out.println("序言表現很好..");
}
public void reportToHasband(Object info){
System.out.println("報告老公:"+info);
}
}
~~~
觀察者模式的優點
---|觀察者和被觀察者之間是抽象耦合
---|建立一套觸發機制
觀察者模式的缺點:
---|觀察者模式的效率問題
觀察者的使用場景
---|關聯行為場景,需要注意的是,關聯行為是可拆分的,而不是”組合“關系
---|事件多級觸發場景
---|跨系統的消息交換場景,如消息隊列的處理機制
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式