1. 程式人生 > >優先使用組合物件,而不是繼承"的理解

優先使用組合物件,而不是繼承"的理解

繼承應該不陌生了,OO的基本特性之一,由於繼承易於理解,比很多地方都用,可以說有面向物件設計的地方都用,以至於被濫用。組合物件,可能聽到的也有,但真正理解的可能就不多了的。筆者剛看到組合物件這詞也很蒙,不知何物?

下面貼一段程式碼來理解一下組合物件。此程式碼是用php實現觀察者模式。

<?php
/**
 * 定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。
 */

//抽象主題角色
interface Subject {

	//增加一個新的觀察者物件
	public function attach(Observer $observer);/*使用了一個物件作為引數
*/ //刪除一個已經註冊觀察者物件 public function detach(Observer $observer);/*使用了物件作為引數*/ //通知所有註冊過的觀察者物件 public function notifyObservers(); } //具體主題角色 class ConcreteSubject implements Subject { private $_observers; public function __construct(){ $this->_observers=array();/*物件陣列*/ } public function attach(Observer $observer){/*使用了物件作為引數
*/ return array_push($this->_observers,$observer); } public function detach(Observer $observer){/*使用了物件作為引數*/ $index=array_search($observer,$this->_observers); if($index===false||!array_key_exists($index,$this->_observers)){ return false; } unset($this->_observers[$index]); return true; } public function notifyObservers(){ if(!is_array($this->_observers)){ return false; } foreach ($this->_observers as $observer){ $observer->update(); } return true; } } //抽象觀察者 interface Observer{ public function update(); } //具體觀察者 class ConcreteObserver implements Observer{ private $_name; public function __construct($name){ $this->_name=$name; } public function update(){ echo 'Observer', $this->_name, ' has notified.<br />'; } } class Client{ public static function main(){ $subject = new ConcreteSubject(); $observer1 = new ConcreteObserver("buttonfly"); $subject->attach($observer1); echo "<br/> This First notify:<br/>"; $subject->notifyObservers(); $observer2 = new ConcreteObserver("china"); $subject->attach($observer2); echo '<br/>The Second notify:<br/>'; $subject->notifyObservers(); $observer3 = new ConcreteObserver("hello"); $subject->attach($observer3); echo '<br/> The Third notify:<br/>'; $subject->notifyObservers(); $subject->detach($observer1); echo '<br/> The Third notify:<br/>'; $subject->notifyObservers(); } } Client::main(); ?>

上段程式碼中,有/**/註釋的就使用了物件組合。

類繼承被稱為白箱複用,被繼承的類對其繼承者是透明的。因此會破壞其內部結構。彼此的依賴程度高。

組合物件被稱為黑箱複用,物件之間對彼此的結構不清楚,只需要關心提供的介面。彼此的依賴低。