場景:要寫一個訂單系統,買了東西后要給用戶發送email,改變訂單狀態,等等。php
一般是這麼寫的:設計模式
class Order{ public function buy(){ echo 'buy!'; $email = new Email(); $email -> doing(); $os = new orderStatus(); $os -> doing(); } } class Email{ public function doing(){ echo "send Email!!"; } } class orderStatus{ public function doing(){ echo "order finish!!"; } } $order = new Order(); $order -> buy();
這樣就完成了?學了設計模式原則之後,怎麼感受壞極了。擴展性太差。order和email,orderstatus間的耦合過高了,類的複用性太差。(違反了開閉原則和迪米特法則)this
class Order{ protected $observers = array(); public function addObserve($type, $observer){ $this -> observers[$type][] = $observer; } public function observer( $type ){ if(isset($this -> observers[$type])){ foreach($this -> observers[$type] as $observer){ $observer -> doing( $this ); } } } public function buy(){ echo "buy!!!"; $this -> observer('buy'); } } interface IDo{ public function doing(); } class Email implements IDo{ public function doing(){ echo "send Email!!"; } } class orderStatus implements IDo{ public function doing(){ echo "order finish!!"; } } $order = new Order(); $order -> addObserve('buy', new Email() ); $order -> addObserve('buy', new orderStatus () ); $order -> buy();
觀察者模式:可以更便利建立和處理與核心對象相關對象的動做,而且提供和核心對象(order)非耦合的系列功能。spa
觀察者模式很是實用,在這種場景下的應用可以最大程度的下降類之間的耦合度,提升類的複用性。
設計