作為開始,我們建立一個(gè)普通的可以被擴(kuò)展產(chǎn)生具體的特定裝飾器的WidgetDecorator類。至少WidgetDecorator類應(yīng)該能夠在它的構(gòu)造函數(shù)中接受一個(gè)組件,并復(fù)制公共方法paint()。
class WidgetDecorator { var $widget; The Decorator Pattern 207 function WidgetDecorator(&$widget) { $this->widget =& $widget; } function paint() { return $this->widget->paint(); } }
為建立一個(gè)標(biāo)簽(lable),需要傳入lable的內(nèi)容,以及原始的組件:
class Labeled extends WidgetDecorator { var $label; function Labeled($label, &$widget) { $this->label = $label; $this->WidgetDecorator($widget); } }
有標(biāo)簽的組件也需要復(fù)制paint()方法,并將標(biāo)簽信息增加到輸出中:
class Labeled extends WidgetDecorator { var $label; function Labeled($label, &$widget) { $this->label = $label; $this->WidgetDecorator($widget); } function paint() { return ‘<b>’.$this->label.’:</b> ‘.$this->widget->paint(); } }
你可以用一個(gè)測(cè)試檢驗(yàn)它:
class WidgetTestCase extends UnitTestCase { function testLabeled() { $text =& new Labeled( ‘Email’ ,new TextInput(‘email’)); $output = $text->paint(); 208 The Decorator Pattern $this->assertWantedPattern(‘~^<b>Email:</b> <input~i’, $output); } }
我們已經(jīng)看到TextInput和Labeled類的能力,你可以裝配一個(gè)類整體來管理表單(form)。 FormHandler類有一個(gè)靜態(tài)的build()方法從表單的各種元素創(chuàng)建一個(gè)部件的數(shù)組。
class FormHandlerTestCase extends UnitTestCase { function testBuild() { $this->assertIsA($form = FormHandler::build(new Post), ‘Array’); $this->assertEqual(3, count($form)); $this->assertIsA($form[1], ‘Labeled’); $this->assertWantedPattern(‘~email~i’, $form[2]->paint()); } }
實(shí)現(xiàn)FormHandler 的代碼:
class FormHandler { function build() { return array( new Labeled(‘First Name’, new TextInput(‘fname’)) ,new Labeled(‘Last Name’, new TextInput(‘lname’)) ,new Labeled(‘Email’, new TextInput(‘email’)) ); } }
現(xiàn)在,這段代碼并不能工作—沒有通過$_post提交的數(shù)據(jù)。因?yàn)檫@段代碼必須要使用一個(gè)MockObject對(duì)象 (參見第6章)測(cè)試,現(xiàn)在我們可以將$_post數(shù)據(jù)包裝在一個(gè)類似哈希的對(duì)象中—與Registry(參見第五章)類似,或者模仿WACT的DataSource從Specification pattern
class Post { var $store = array(); function get($key) { if (array_key_exists($key, $this->store)) return $this->store[$key]; The Decorator Pattern 209 } function set($key, $val) { $this->store[$key] = $val; } }
出處:phpchina
責(zé)任編輯:bluehearts
上一頁 php設(shè)計(jì)模式介紹之裝飾器模式 [2] 下一頁 php設(shè)計(jì)模式介紹之裝飾器模式 [4]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|