《PHP學習:學習php設計模式 php實現(xiàn)合成模式(composite)》要點:
本文介紹了PHP學習:學習php設計模式 php實現(xiàn)合成模式(composite),希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP編程一、意圖
將對象組合成樹形結構以表示”部分-整體”的層次結構.Composite使用戶對單個對象和組合對象的使用具有一致性.
Composite變化的是一個對象的結構和組成.
二、合成模式中主要角色
抽象組件(Component)角色:抽象角色,給參加組合的對象規(guī)定一個接口.在適當?shù)那闆r下,實現(xiàn)所有類共有接口的缺省行為.聲明一個接口用于訪問和管理Component的子組件
樹葉組件(Leaf)角色:在組合中表示葉節(jié)點對象,葉節(jié)點沒有子節(jié)點.在組合中定義圖元對象的行為.
樹枝組件(Composite)角色:存儲子部件.定義有子部件的那些部件的行為.在Component接口中實現(xiàn)與子部件有關的操作.
客戶端(Client):通過Component接口把持組合部件的對象
三、合成模式的優(yōu)點和缺點Composite模式的優(yōu)點
1、簡化客戶代碼
2、使得更容易增加新類型的組件
PHP編程Composite模式的缺點:使你的設計變得更加一般化,容易增加組件也會產(chǎn)生一些問題,那就是很難限制組合中的組件
四、合成模式適用場景1、你想表示對象的部分-整體層次結構
2、你希望用戶忽略組合對象和單個對象的不同,用戶將統(tǒng)一地使用組合結構中的所有對象.
五、合成模式與其它模式
裝飾器模式:Decorator模式經(jīng)常與Composite模式一起使用.當裝飾與合成一起使用時,它們通常有一個公共的父類.因此裝飾必須支持具有add,remove和getChild操作的Component接口
享元模式:Flyweight模式讓你共享組件,但不再引用他們的父部件
迭代器模式:Itertor可用來遍歷Composite
訪問者模式:Visitor將本來應該分布在Composite和Leaf類中的操作和行為局部化.
六、平安式的合成模式
在Composite類里面聲明所有的用來管理子類對象的方法.這樣的做法是平安的.因為樹葉類型的對象根本就沒有管理子類的方法,因此,如果客戶端對樹葉類對象使用這些方法時,程序會在編譯時期出錯.編譯通不過,就不會出現(xiàn)運行時期錯誤
這樣的缺點是不夠透明,因為樹葉類和合成類將具有不同的接口.
七、平安式的合成模式結構圖?
PHP編程
PHP編程八、平安式的合成模式PHP示例
PHP編程
<?php
/**
* 抽象組件角色
*/
interface Component {
/**
* 返回自己的實例
*/
public function getComposite();
/**
* 示例辦法
*/
public function operation();
}
/**
* 樹枝組件角色
*/
class Composite implements Component {
private $_composites;
public function __construct() {
$this->_composites = array();
}
public function getComposite() {
return $this;
}
/**
* 示例辦法,調(diào)用各個子對象的operation辦法
*/
public function operation() {
echo 'Composite operation begin:<br />';
foreach ($this->_composites as $composite) {
$composite->operation();
}
echo 'Composite operation end:<br /><br />';
}
/**
* 聚集管理辦法 添加一個子對象
* @param Component $component 子對象
*/
public function add(Component $component) {
$this->_composites[] = $component;
}
/**
* 聚集管理辦法 刪除一個子對象
* @param Component $component 子對象
* @return boolean 刪除是否成功
*/
public function remove(Component $component) {
foreach ($this->_composites as $key => $row) {
if ($component == $row) {
unset($this->_composites[$key]);
return TRUE;
}
}
return FALSE;
}
/**
* 聚集管理辦法 返回所有的子對象
*/
public function getChild() {
return $this->_composites;
}
}
class Leaf implements Component {
private $_name;
public function __construct($name) {
$this->_name = $name;
}
public function operation() {
echo 'Leaf operation ', $this->_name, '<br />';
}
public function getComposite() {
return null;
}
}
/**
* 客戶端
*/
class Client {
/**
* Main program.
*/
public static function main() {
$leaf1 = new Leaf('first');
$leaf2 = new Leaf('second');
$composite = new Composite();
$composite->add($leaf1);
$composite->add($leaf2);
$composite->operation();
$composite->remove($leaf2);
$composite->operation();
}
}
Client::main();
?>
PHP編程以上就是使用php實現(xiàn)合成模式的代碼,還有一些關于合成模式的概念區(qū)分,希望對大家的學習有所幫助.
維易PHP培訓學院每天發(fā)布《PHP學習:學習php設計模式 php實現(xiàn)合成模式(composite)》等實戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/8288.html