为了适应HwLib的不同版本进行编码
,先进行一些基于第一版本HwLib接口的测试:
classAdapterTestCaseextendsUnitTestCase{
functionTestOriginalApp(){
$lib=&newHwLib;
$this->assertEqual(
‘HelloWorld!’
,$lib->hello().$lib->world());
}
}
你同样可以表明
,对这个库的简单升级将造成此应用程序的失效
。 classAdapterTestCaseextendsUnitTestCase{
TheAdapterPattern221
functionTestOriginalAppWouldFail(){
$lib=&newHwLib;//nowusingHwLibversion2
$this->assertFalse(method_exists($lib,‘hello’));
}
}
(这个测试以method_exists()为例证
。如果你简单地更换这个库的第二版本并且以TestOriginalApp()的测试再次运行AdapterTestCase,
PHP就会运行失败,同时报告“致命错误:未定义的函数:hello()”)
针对API“升级”的解决办法就是创建一个适配器(Adapter)。
第一步是获得第二版本HwLib的实例的一个引用,并且把它加入到你的Adapter类中。
classHwLibV2ToV1Adapter{
var$libv2;
functionHwLibV2ToV1Adapter(&$libv2){
$this->libv2=&$libv2;
}
}
这个范例展示了将这个实例传递给构造函数的过程,你也可以运用Factory或Singleton,或者其它适合你要求的创建模式,来创建一个新的实例。(通过前两章,你应该对HwLibV2ToV1Adapter的编写用途很熟悉了)
当得到第二版本HwLib的时候,你如何使它在第一版本HwLib的实例中体现?
classHwLibV2ToV1Adapter{
var$libv2;
functionHwLibV2ToV1Adapter(&$libv2){
$this->libv2=&$libv2;
}
functionhello(){
return$this->libv2->greet();
}
functionworld(){
return$this->libv2->world();
}
}
HwLibV2ToV1Adapter::hello()方法代表了$libv2对象的greet()方法。
接着,你该如何在程序中使用它?
classAdapterTestCaseextendsUnitTestCase{
functionTestOriginalAppWithAdapter(){
$lib=&newHwLibV2ToV1Adapter(newHwLib);
$this->assertEqual(
‘GreetingsandSalutationsWorld!’
,$lib->hello().$lib->world());
}
}