觀察者模式

觀察者模式 : 定義了對象之間的一對多的依賴,當一個對象改變狀態時,它的所有依賴者都會受到通知並自動更新;

      

設計原則  :  爲了交互對象之間的鬆耦合設計而努力;

                   鬆耦合設計 : 能應對變化,對象之間的互相依賴降至最低;

使用場景 :當一組數據變化時 ,會有連鎖反應,其他與其相關的對象都需要調整狀態 。這時使用觀察者模式 。

例如 : 牙膏生產商的某款牙膏漲價了 ,那麼該商品的代理商也要漲價 ,超市售價也要上漲  ;這就是一個簡單的連鎖反應,並且是一對多的關係。

簡單分析下 , 觀察者模式應有的邏輯流程 ,還是以上述的例子說明。

首先 ,要有牙膏工廠 ,其他人都是圍繞它旋轉的 。工廠應該可以註冊 / 撤銷代理的功能(register/ remove) ,還可以任意修改商品的價格 ,因爲東西都是它自己的(也就是私有變量).,還有一個功能就是通知了 ,只要價格變動就發送通知所有的代理商;

其次 ,定義代理商 ,就是接受通知 。


package com.baidu.designModel.observer;
/**
 * 測試觀察者模式
 * @author 
 * 1,Subject是被觀察者 ,定義註冊/移除 ,通知方法;
 * 2,定義Observer接口,更新狀態(update)
 * 3,實現Subject ,並定義集合,裝載觀察者 ,可以註冊某個觀察者,可以移除註冊,通知所有觀察者 ;
 * 4,實現Observer ,創建對象時 ,就註冊爲觀察者 ,在update中修改邏輯;
 */
public class Test {
public static void main(String[] args) {
FirstSubject fs = new FirstSubject();

FirstObserver fo1 = new FirstObserver(fs);
FirstObserver fo2 = new FirstObserver(fs);
FirstObserver fo3 = new FirstObserver(fs);
fs.setTestData(100);
}
}

------------------------------------------------------------------------------------

public interface Subject {
/**
* 註冊觀察者
* @param o
*/
void registerObserver(Observer o);
/**
* 移除觀察者
* @param o
*/
void removeObserver(Observer o);
/**
* 通知
*/
void notifyObservers();
}

-----------------------------------------------------------------------------------

public interface Observer {
/**
* 更新數據
* @param testData
*/
void update(int testData);

}

------------------------------------------------------------------------------------

import java.util.ArrayList;
import java.util.List;


public class FirstSubject implements Subject {
/**
* 所有的觀察者
*/
private List<Observer> list;
private int testData;

public FirstSubject(){
list = new ArrayList<>();
}
@Override
public void notifyObservers() {
//通知所有觀察者
for(Observer ob:list){
ob.update(testData);
}
}


@Override
public void registerObserver(Observer o) {
list.add(o);
}


@Override
public void removeObserver(Observer o) {
list.remove(o);
}

public void setTestData(int testData) {
this.testData = testData;
//數據變化,通知觀察者
notifyObservers();
}
}

-----------------------------------------------------------------------------------

public class FirstObserver implements Observer {
private Subject sub;
/**
* 成爲觀察者
* @param sub
*/
public FirstObserver(Subject sub){
this.sub = sub;
sub.registerObserver(this);
}

@Override
public void update(int testData) {
//TODO:收到數據變化
System.out.println(this+"接收到數據 :"+testData);
}
}


發佈了63 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章