php教程:php设计模式介绍之适配器模式(3)

http://www.itjxue.com  2015-07-17 08:20  来源:未知  点击次数: 

刚才的程序测试和现在的程序代码都有一定程度的脆弱性。有没有方法在长久的使用中让它们都更易于维护呢?当然是有的!

回忆一下(第三章)Factory是如何提供一个更灵活的方法来创建类的实例的。为了更好地在将来检验这些代码,就从一个简单的Factory函数开始:

function &HwLibInstance() {
return new HwLib;
}

为了测试Factory,直接调用它而不创建它的实例:

class AdapterTestCase extends UnitTestCase {
function TestAppWithFactory() {
$lib =& HwLibInstance();
$this->assertWantedPattern(
‘/\w+ World!$/’
,$lib->hello().$lib->world());
}
}

有两个方面需要注意:Factory创建了对象,而用于确认的assertEqual()函数被修改为更灵活的assertWantedPattern()。你现在可以用一个正则表达式来捕获你在库中所要查找的“核心”,但可能会使这个测试本身变得脆弱。

接下来,升级HwLib库。当安装了HwLib第二版,你就可以修改HwLibInstance()函数来适应新的版本。

function &HwLibInstance($ver=false) {
switch ($ver) {
case ‘V2’:
return new HwLib;
default:
return new HwLibV2ToV1Adapter(new HwLib);
}
}

现在重新运行AdapterTestCase。测试通过!(绿色进度条正常。)因为原始的程序没有传递一个参数,HwLibInstance会默认返回封装在HwLibV2toV1Adapter中的HwLib的一个实例。尽管如此,如果你编写了新的代码,你可以传递进一个“V2”的参数让这个函数自动选择HwLib的新版本而不用去调整它。

以后,如果你选择升级HwLib的第三版,应该将Factory做如下的调整:

function &HwLibInstance($ver=false) {
switch ($ver) {
case ‘V3’:
return new HwLib;
case ‘V2’:
return new HwLibV3ToV2Adapter(new HwLib);
default:
return new HwLibV2ToV1Adapter(
new HwLibV3ToV2Adapter(new HwLib));
}
}


(责任编辑:IT教学网)

更多