[PHP] 看博客学习观察者模式 - 陶士涵
程序员文章站
2022-06-03 14:54:46
...
具体应用场景是,当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;ithis.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 Listobservers=new ArrayList (); 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("我在做..."); } } }