优先使用组合对象,而不是继承"的理解

继承应该不陌生了,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();
?>



上段代码中,有/**/注释的就使用了对象组合。

类继承被称为白箱复用,被继承的类对其继承者是透明的。因此会破坏其内部结构。彼此的依赖程度高。

组合对象被称为黑箱复用,对象之间对彼此的结构不清楚,只需要关心提供的接口。彼此的依赖低。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值