loveapple 2007-8-23 16:56
[PHP设计模式]Composite(组合)模式范例
来自于:[url]http://bbs.loveapple.cn/loveappleSearch.php?formhash=ddc13296&q=%5BPHP%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%5DComposite%28%E7%BB%84%E5%90%88%29%E6%A8%A1%E5%BC%8F%E8%8C%83%E4%BE%8B&sa=%E6%8F%90%E4%BA%A4&domains=bbs.loveapple.cn&sitesearch=bbs.loveapple.cn&client=pub-2097865745512830&forid=1&ie=UTF-8&oe=UTF-8&cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%23336699%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3AFFFFFF%3BLBGC%3A336699%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BFORID%3A11&hl=zh_CN[/url]
|/W4|w0Ea+^+W$AZ
(Y!d,rfFJY#M$x
Composite模式定义:
/\)Mu
D6F4i?
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.8MrH X7s%H
ec4}e5g%t0U`
j
Composite 比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。gj)J$A4Rb
5P'^@%Wt{}a3k
所以Composite模式使用到Iterator模式,和Chain of Responsibility模式类似。!A @,LO%V~
A"Z;w
AS$?)L
Composite好处:
,q7{#@rB$yM p
hG
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。)l0SJM)V'Q
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。s`Q
tK&H
Y*P5I%M+H'A
如何使用Composite?
7Ir+cVl!vk
首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component)
OL6p:n*X+B1z!{kX
k*jw?_3O0I
[[i] 本帖最后由 loveapple 于 2007-9-8 01:33 编辑 [/i]]
loveapple 2007-8-23 16:56
[code]interface Component{
+}t UwuD*A1Ov.gW
public function dispName();u&B"w9QB
public function setParent(Category $category);(tfw'ti'f Vv
public function getParent();tj z]N7x
public function getName();
6B/xzC2na
public function setName($name);
&vZ$[(wPBl4Q
}(},[y&V#M({|
Y'o4yt,^ p"]
class Composite implements Component {
'{MD'I3N7c3{G
private $name;.vr-gH
?#q
private $subList;g:h8xo4e
private $parent;G7qu3?H2{
public function __construct($name){d r0H+o+^_ M0L
$this->setName($name);Zz#QdP(`3p w
}
6k%hb)O;?9s6v
public function dispName(){;I'U+H0\!{.|9X6^h
print $this->name."\n";1~)I/hT)yJW
}
u7U0km
F4@f)r _;Nv
public function setName($name){
^5A@:jNsn.o
$this->name = $name;
1f(T:B5Rw5h
}
%fn"sR)_w/t[/zy:v
public function getName(){3cS,UW7C F%J?^
return $this->name;IKT!w,lCh'b
}_8pes,@;q4^yJ?
public function setSubList(array $subList){
$Yg[ g:a[F
$this->subList = $subList;#X_wgum
}D5q
}E7\0GwY
public function getSubList(){zG+r:rh*d|
return $this->subList;
d#P!N6jSf}C3[
}0u2^.h.p2O Q
public function addSubList(AbstractContents $contents){(Y$[$Gb&sE?
$this->subList[] = $contents;+B4z Fj'X5K6r
$contents->setParent($this);8BvX0n-C4e B G
}A)q5l+[Jx1o8D
public function setParent(Category $category){%o(I$t6{7\j~
$this->parent = $category;
n;tp7bxP+[w
}
RX9g@:e8|:t"j%n:}$J
public function getParent(){
KNg z
V d4r
K4_,R
return $this->parent;
h*hqw g3H*N
}I[]M/B$sD
public function disList($parent=""){
6l/WJDa-vk3G
if(is_null($this->subList)){&H(d^h;Q7Oh
return;{{#]hV'gP/S@
}