[PHP] 看博客学习观察者模式

时间:2023-12-17 12:47:08

具体应用场景是,当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("我在做...");
}
}
}