1. 程式人生 > >設計模式(十六) 觀察者模式

設計模式(十六) 觀察者模式

觀察者模式也叫釋出/訂閱模式, 定義一種1對多的依賴關係,使得每當一個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新

在這裡插入圖片描述

觀察者模式的幾個角色:

  • Subject 被觀察者。定義被觀察者必須實現的職責,它必須能夠動態的增加,取消觀察者。 要有管理觀察者並通知觀察者。
  • Observer觀察者。觀察者接收到訊息後,進行update操作,對接收到的資訊進行處理。
  • ConcreteSubject 具體的被觀察者。 定義被觀察者自己的業務邏輯,同時定義對哪些事件進行通知。
  • ConcreteObserver 具體的觀察者。 每個觀察者接收到訊息後的處理反應是不同的,各個觀察者有自己的處理邏輯。

public abstract class Subject{

	private Vector<Observer> obsVector=new Vector<>();
	public	void addObserver(Observer o){
		this.obsVector.add(o);
	}
   public	void delObserver(Observer o){
		this.obsVector.remove(o);
	}
	public	void  notifyObservers(Observer o){
		for(Observer o: this.obsVector){
			o.update();
		}
	}
}
public class ConcreteSubject extends Subject{
	public void doSomething(){
		// do something
		super.notifyObservers();
	}
}
public interface Observer{
	public void update();
}
public class ConcreteObserver implements Observer{
		public void udpate(){
			System.out.println("receive message , and handle");
		}
}
public class Client{
		public static void main(String[] args){
			 ConcreteSubject subject=new ConcreteSubject();
			 Observer obs=new ConcreteObserver();
			 subject.addObserver(obs);
			subject.doSomething();
		}
}

觀察者模式的優點

  • 觀察者和被觀察者之間是抽象耦合的
  • 建立一套觸發機制。 根據單一職責,每個類的職責都是單一的,觀察者模式為不同類之間的職責串了起來。

觀察者模式缺點

開發效率與執行問題,多個觀察者時,觀察者卡殼會影響整體執行效率。

觀者者模式的使用場景

  • 關聯行為場景
  • 事件多級觸發
  • 跨系統的訊息交換場景,如訊息佇列的處理機制。

觀察者模式的注意事項

  • 廣播鏈的問題。 觀察者和被觀察者不要形成環
  • 非同步處理問題。