有感而发,感觉现在想买双靠谱的假鞋比真鞋都难~
1:什么是观察者模式?
- 编程和生活其实是很像的,比如我们在坐地铁。
- 到了【红桥区】,地铁的小喇叭会通知在地铁上的每个人,由我们来决定是否下车。
- 这里的话,【地铁上的乘客】其实就扮演了【观察者】的角色,【观察】地铁的动态。
- 说到这,明白观察者模式要干什么了么?
- 是,他就是为了可以集中通知观察者,不管有多少个。同时也没有把地铁和乘客绑在一起,实现了一种双向解耦
2:观察者模式的运用的场景?
- 概念上来说的是:
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
- 白话就是:
- 我是一列地铁,我的乘客数量动态可变。
- 乘客不用知道我现在开车到哪了,我到站了会集体通知我的所有乘客。
3:再看观察者模式
- 上面说了这么多,应该已经对观察者模式有了一定的了解。
- 在观察者模式中,我们首先应该有一个【主题】(类似去坐地铁、坐公交、坐船)
- 而我们的观察者,就是在上面的每一个乘客。
- 这样,我们可以随时可以变化我们的主题,而我们的乘客是不变的。真正的高内聚,低耦合。
- 其实写到这我是很激动地,感觉代码世界的魅力。
4:实现观察者模式
- 如何实现观察者注册?
- 通过前面的注册者模式很容易给我们提供思路,把这些对象加到一棵注册树上就好了嘛。如何通知?这就更简单了,对注册树进行遍历,让每个对象实现其接口提供的操作。
<?php // 主题 class Action { public $_observers=array(); public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } } } // 观察者接口 interface Observer{ public function watch(); } // 观察者 class Cat implements Observer{ public function watch(){ echo "Cat watches TV<hr/>"; } } class Dog implements Observer{ public function watch(){ echo "Dog watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } } // 应用实例 $action=new Action(); $action->register(new Cat()); $action->register(new People()); $action->register(new Dog()); $action->notify();
对于代码的实现可有有多种样式,其实理解他们的理念最为重要。
不必生搬硬套,融汇贯通,学以致用,加油。