不是你写个class 就是面向对象,我基本是都是面向过程来书写class,只是like oo 非 is oo 。 所以写出来的不伦不类,自己也都懒得看别说重构,只能重写。设计模式是面向对象层级较高的部分,属于面向对象的OOD(面向对象设计)。如果对面向对象分析与设计精通,那么读起来会产生共鸣甚至共振。如果是了解面向对象,读起来像白开水,没感觉。因为层级没达到,无法参悟。就像参禅一样。设计模式是遵循面向对象五大原则前提下,高手们给出典型问题的解决办法。设计模式不是重点,重点是那几大原则。
oh,say too long。最近在研究观察者模式,举一个简单的例子 : 猫大叫一生,所有的老鼠都跑了,主人惊醒了 这就是一个经典的 对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,发起者是猫,观察者是老鼠,主人以及其他的生物。 发起者猫又称主题。就是什么玩意都要有个主题的意思。 这个猫主题有几个接口就是 : 观察者的增加和删除,叫。 那么我们定义这个主题的接口可以这么写
interface Subject { public function registerObserver(Observer $obs); public function removeObserver(Observer $obs); public function cry(); }
在定义观察者的接口
interface Observer{ public function update(); }
ok 两个接口定义好了!
因为猫是主题,所以用cat来实现主题接口
class Cat implements Subject { private $_observers = array(); public function registerObserver(Observer $obs) { $this->_observers[]= $obs; } public function removeObserver( Observer $obs){ $index = array_search($obs, $this->_observers); if ($index === FALSE || ! array_key_exists($index, $this->_observers)) { return FALSE; } unset($this->_observers[$index]); return TRUE; } public function cry() { if (!is_array($this->_observers)) { return FALSE; } foreach ($this->_observers as $value) { $value->update(); } } }
好主题的实例化完成了
观察者就很简单了
class Mouse implements Observer { private $_name; function __construct($name, $subject) { $this->_name = $name; $subject->registerObserver($this); } public function update() { echo $this->_name ."拼命的跑\n<br>"; } } class Master implements Observer { private $_name; function __construct($name, $sbuject){ $this->_name = $name; $sbuject->registerObserver($this); } public function update() { echo $this->_name ."主任被惊醒!\n"; } }
实例化调用
class Client { public static function main(){ $cat = new Cat(); $mouseBig = new Mouse('大老鼠',$cat); $mouseSmall = new Mouse('小老鼠', $cat); $master = new Master('美女', $cat); $cat->cry(); } } Client::main();
ok ,完了!以上自己练着玩,如有雷同,算我抄你