【設計模式】—— 觀察者模式Observer

  前言:【模式總覽】——————————by xingoohtml

  模式意圖

  觀察者模式,也叫發佈/訂閱模式,從名字來講就能察覺到它的過程應該是,發佈——其餘人接受。java

  這個模式定義了對象之間的一種依賴關係,當一個對象發生變化時,其餘的對象收到更新,也發生變化web

  模擬咱們訂閱郵件這個場景,無論咱們的郵箱是在登錄仍是關閉,郵件都會發送到郵箱裏面。只要把本身的郵箱訂閱到這個郵件就能夠了!這個模式也是這樣一個過程。ide

  這個模式代碼相對來講比較容易理解,並且應用很普遍。網站

  應用場景

  1 當一個模型有幾個展示方面,經過修改一個展示,順便更新其餘的。就比如一個網站的有web端,也有移動端,當web端的數據發生變化時,移動端的數據展示也要更新。spa

  2 對一個對象發生改變,而不知道將有多少對象會發生改變時,利用這種模式能夠有效的管理對象。code

  模式結構

  Subject 抽象的主題角色server

interface Subject{ public void attach(Observer observer); public void detach(Observer observer); void notifyObservers(); }

  ConcreteSubject 具體的主題角色,內部有一個容易,用於存放訂閱者htm

class ConcreteSubject implements Subject{ List<Observer> list = new ArrayList(); public void attach(Observer observer) { list.add(observer); } public void detach(Observer observer) { list.remove(observer); } public void notifyObservers() { for(Observer o : list){ o.update(); } } }

  Observer 抽象的訂閱者角色對象

interface Observer{ public void update(); }

  ConcreteObserver 具體的訂閱者

class ConcreteObserver1 implements Observer{ public void update() { System.out.println("ConcreteObserver1 update"); } } class ConcreteObserver2 implements Observer{ public void update() { System.out.println("ConcreteObserver2 update"); } } class ConcreteObserver3 implements Observer{ public void update() { System.out.println("ConcreteObserver3 update"); } }

  所有代碼

 1 package com.xingoo.test.design.observer;  2 
 3 import java.util.ArrayList;  4 import java.util.List;  5 
 6 interface Subject{  7     public void attach(Observer observer);  8     public void detach(Observer observer);  9     void notifyObservers(); 10 } 11 class ConcreteSubject implements Subject{ 12     List<Observer> list = new ArrayList(); 13     public void attach(Observer observer) { 14  list.add(observer); 15  } 16     public void detach(Observer observer) { 17  list.remove(observer); 18  } 19     public void notifyObservers() { 20         for(Observer o : list){ 21  o.update(); 22  } 23  } 24 } 25 interface Observer{ 26     public void update(); 27 } 28 class ConcreteObserver1 implements Observer{ 29     public void update() { 30         System.out.println("ConcreteObserver1 update"); 31  } 32 } 33 class ConcreteObserver2 implements Observer{ 34     public void update() { 35         System.out.println("ConcreteObserver2 update"); 36  } 37 } 38 class ConcreteObserver3 implements Observer{ 39     public void update() { 40         System.out.println("ConcreteObserver3 update"); 41  } 42 } 43 public class Client { 44     public static void main(String[] args) { 45         Subject subject = new ConcreteSubject(); 46         Observer o1 = new ConcreteObserver1(); 47         Observer o2 = new ConcreteObserver2(); 48         Observer o3 = new ConcreteObserver3(); 49  subject.attach(o1); 50  subject.attach(o2); 51  subject.attach(o3); 52  subject.notifyObservers(); 53         
54  subject.detach(o2); 55  subject.notifyObservers(); 56  } 57 }
View Code

  運行結果

ConcreteObserver1 update ConcreteObserver2 update ConcreteObserver3 update ConcreteObserver1 update ConcreteObserver3 update
相關文章
相關標籤/搜索