設(shè)計(jì)模式——觀察者模式
很好理解的例子
例子:李斯監(jiān)控韓非子衣食住行
一個(gè)抽象接口:被觀察者接口
public interface Observable{
public void addObserver(Obeserver observer);
public void deleteObserver(Observer observer);
public void notifyObserver(String context);
}
//韓非子自己的特定動(dòng)作
public interface IHanFeiZi{
public void haveBreakfast();
public void haveFun();
}
public class HanFeiZi implements IHanFeiZi,Observable {
// 定義個(gè)變長(zhǎng)數(shù)組,存放所有的觀察者
private ArrayList<Observer> observerList = new ArrayList<Observer>;
public void addObserver(Obeserver observer){
this.observerList.add(observer);
}
public void deleteObserver(Observer observer){
this.observerList.remove(observer);
}
public void notifyObserver(String context){
for(Observer observer:observerList){
observer.update(context);
}
}
public void haveBreakfast(){
//doSomething
this.notifyObserver("isHavingBreakfast");
}
public void haveFun(){
// doSomething
this.notifyObserver("isHavingFun");
}
}
一個(gè)抽象接口:抽象觀察者
public interface Observer{
public void update(String context);
}
public class Lisi implements Observer{
public void update(String str){
// doSomething
this.reportToQinShiHuang(str);
}
private void reportToQinShiHuang(String reportContext){
System.out.println(reportContext);
}
}
場(chǎng)景類
public class Client(){
public static void main(String[] args) throws InterruptedExeption{
Observer liSi = new LiSi();
Observer wangSi = new WangSi();
Observer liuSi = new LiuSi();
// ...一系列Observer
HanFeiZi hanFeiZi = new HanFeiZi();
hanFeiZi.addObserver(liSi);
hanFeiZi.addObserver(wangSi);
hanFeiZi.addObserver(liuSi);
hanFeiZi.haveBreakfast();
HanFeiZi.haveFun();
}
}
觀察者模式(發(fā)布/訂閱)總結(jié)
定義
Define a one- to- many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定義對(duì)象間一種一對(duì)多的依賴關(guān)系使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到更新
觀察者模式
- Subject被觀察者
定義被觀察者必須實(shí)現(xiàn)的職責(zé),它必須能夠動(dòng)態(tài)地增加,取消觀察則會(huì)。它一般是抽象類或者是實(shí)現(xiàn)類,僅僅完成作為被觀察者必須實(shí)現(xiàn)的職責(zé);管理觀察者并通知觀察者
//ArrayList是線程異步,不安全
//Vector是線程同步,安全
public abstract class Subject{
private Vector<Observer> obsVector = new Vector<Observer>();
public void addObserver(Observer observer){
this.obsVector.add(observer);
}
public void deleteObserver(Observer observer){
this.obsVector.remove(observer);
}
public void notifyObserver(){
for(Observer observer: this.obsVector ){
observer.update();
}
}
}
- Observer觀察者
觀察者接收到消息后,即進(jìn)行update操作,對(duì)接收到的信息進(jìn)行處理
// 觀察者一般是一個(gè)接口
public interface Observer{
public void update();
}
- ConcreteSubject具體的被觀察者
定義被觀察者自己的業(yè)務(wù)邏輯,同時(shí)定義對(duì)哪些時(shí)間進(jìn)行通知
public class ConcreteSubject extends Subject{
public void doSomething(){
/**
* doSomething;
*/
super.notifyObserver();
}
}
- ConcreteObserver具體的觀察者
每個(gè)觀察在接收到消息后的處理反應(yīng)是不同,每個(gè)觀察者都有自己的處理邏輯
public class ConcreteObserver implements Observer{
public void update(){
/**
* doSomething
*/
System.out.println("接收消息");
}
}
- 場(chǎng)景類
public class Client{
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer = new ConcreteObserver();
//...重復(fù)多個(gè)Observer觀察對(duì)象
subject.addObserver(observer);
subject.doSomething();
}
}
觀察者模式的優(yōu)缺點(diǎn)
觀察者模式的優(yōu)點(diǎn)
- 觀察者與被觀察者之間是抽象耦合
- 建立一套觸發(fā)機(jī)制
觀察者模式的缺點(diǎn)
- 一個(gè)觀察者卡殼,會(huì)影響著整體的執(zhí)行效率,一般采用異步的方式
觀察者模式的適用場(chǎng)景
- 關(guān)聯(lián)行為場(chǎng)景
- 事件多級(jí)觸發(fā)場(chǎng)景
- 跨系統(tǒng)的消息交換場(chǎng)景