为了适应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“升级”的解决办法就是创建一个适配器(Adapter)。 第一步是获得第二版本HwLib的实例的一个引用,并且把它加入到你的Adapter类中。
class HwLibV2ToV1Adapter { var $libv2; function HwLibV2ToV1Adapter (&$libv2) { $this->libv2 =& $libv2; } }
这个范例展示了将这个实例传递给构造函数的过程,你也可以运用Factory 或 Singleton ,或者其它适合你要求的创建模式,来创建一个新的实例。(通过前两章,你应该对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]
◎进入论坛网络编程版块参加讨论
|