為了適應HwLib的不同版本進行編碼,先進行一些基于第一版本HwLib接口的測試:
class AdapterTestCase extends UnitTestCase { function TestOriginalApp() { $lib =& new HwLib; $this->assertEqual( ‘Hello World!’ ,$lib->hello().$lib->world()); } }
你同樣可以表明,對這個庫的簡單升級將造成此應用程序的失效。
class AdapterTestCase extends UnitTestCase { The Adapter Pattern 221 function TestOriginalAppWouldFail() { $lib =& new HwLib; // now using HwLib version 2 $this->assertFalse(method_exists($lib, ‘hello’)); } }
(這個測試以method_exists()為例證。如果你簡單地更換這個庫的第二版本并且以TestOriginalApp()的測試再次運行AdapterTestCase,PHP就會運行失敗,同時報告“致命錯誤:未定義的函數:hello()”) 針對API“升級”的解決辦法就是創(chuàng)建一個適配器(Adapter)。 第一步是獲得第二版本HwLib的實例的一個引用,并且把它加入到你的Adapter類中。
class HwLibV2ToV1Adapter { var $libv2; function HwLibV2ToV1Adapter (&$libv2) { $this->libv2 =& $libv2; } }
這個范例展示了將這個實例傳遞給構造函數的過程,你也可以運用Factory 或 Singleton ,或者其它適合你要求的創(chuàng)建模式,來創(chuàng)建一個新的實例。(通過前兩章,你應該對HwLibV2ToV1Adapter的編寫用途很熟悉了)
當得到第二版本HwLib的時候,你如何使它在第一版本HwLib的實例中體現?
class HwLibV2ToV1Adapter { var $libv2; function HwLibV2ToV1Adapter (&$libv2) { $this->libv2 =& $libv2; } function hello() { return $this->libv2->greet(); } function world() { return $this->libv2->world(); } }
HwLibV2ToV1Adapter::hello()方法代表了$libv2對象的greet()方法。 接著,你該如何在程序中使用它?
class AdapterTestCase extends UnitTestCase { function TestOriginalAppWithAdapter() { $lib =& new HwLibV2ToV1Adapter(new HwLib); $this->assertEqual( ‘Greetings and Salutations World!’ ,$lib->hello().$lib->world()); } }
出處:phpchina
責任編輯:bluehearts
上一頁 php設計模式介紹之適配器模式 [1] 下一頁 php設計模式介紹之適配器模式 [3]
◎進入論壇網絡編程版塊參加討論
|