前言:【模式總覽】——————————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 }
運行結果
ConcreteObserver1 update ConcreteObserver2 update ConcreteObserver3 update ConcreteObserver1 update ConcreteObserver3 update