不是你寫個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 ,完了!以上自己練着玩,如有雷同,算我抄你