具體應用場景是,當subject的某個動作需要引發一系列不同對象的動作(比如你是一個班長要去通知班裡的某些人),與其一個一個的手動調用觸發的方法(私下裡一個一個通知),不如維護一個列表(建一個群),這個列表存有你想要調用的對象方法(想要通知的人);之後每次做的觸發的時候只要輪詢這個列表就好了(群發) ...
具體應用場景是,當subject的某個動作需要引發一系列不同對象的動作(比如你是一個班長要去通知班裡的某些人),與其一個一個的手動調用觸發的方法(私下裡一個一個通知),不如維護一個列表(建一個群),這個列表存有你想要調用的對象方法(想要通知的人);之後每次做的觸發的時候只要輪詢這個列表就好了(群發),而不用關心這個列表裡有誰,只用關心想讓誰加入讓誰退出
PHP版:
//這個是主題 class Paper{ private $_observers=array(); public function register($obj){ $this->_observers[]=$obj; } public function start(){ if(!empty($this->_observers)){ foreach($this->_observers as $observer){ $observer->todo(); } } } } //這個是觀察者 class observer{ public function todo(){ echo "我在做..."; } } $paper=new Paper(); $paper->register(new observer()); $paper->register(new observer()); $paper->start();
javascript版:
//這是主題 function Paper(){ this.observers=[]; this.register=function(obj){ this.observers.push(obj); } this.start=function(){ for(var i=0;i<this.observers.length;i++){ this.observers[i].todo(); } } } //這是觀察者 function Observer(){ this.todo=function(){ console.log("我在做..."); } } var paper=new Paper(); paper.register(new Observer()); paper.register(new Observer()); paper.start();
java版:
package com.tsh.mthread; import java.util.ArrayList; import java.util.List; public class Home { public static void main(String[] args) { Paper paper=new Paper(); paper.register(new Observer()); paper.register(new Observer()); paper.start(); } //這是主題 private static class Paper{ private List<Observer> observers=new ArrayList<Observer>(); public void register(Observer observer){ observers.add(observer); } public void start(){ if(observers.size()!=0){ for(Observer observer:observers){ observer.todo(); } } } } //這是觀察者 private static class Observer{ public void todo(){ System.out.println("我在做..."); } } }