继承应该不陌生了,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();
?>
上段代码中,有/**/注释的就使用了对象组合。
类继承被称为白箱复用,被继承的类对其继承者是透明的。因此会破坏其内部结构。彼此的依赖程度高。
组合对象被称为黑箱复用,对象之间对彼此的结构不清楚,只需要关心提供的接口。彼此的依赖低。