总结
如例中代码所示
,你可以运用适配器(Adapter)模式来避免因外部库改变所带来的不便——倘若向上兼容
。作为某个库的开发者
,你应该独立编写适配器,使你的用户更简便地使用新版本的库,而不用去修改他们现有的全部代码
。 GoF书中提出的适配器(Adapter)模式更倾向于运用继承而不是组成。这在强类型语言中是有利的,因为适配器(Adapter)事实上是一个目标类的子类,因而能更好地与类中方法相结合。
下面是HwLib适配器运用继承的范例:
classHwLibGofAdapterextendsHwLib{//extendingversion2.0
functionhello(){
returnparent::greet();
}
}
world()方法没有在类中提到,因为运用了继承,它已经是子类的一部分。
classAdapterTestCaseextendsUnitTestCase{
functionTestHwLibGofAdapter(){
$lib=&newHwLibGofAdapter;
$this->assertEqual(
‘GreetingsandSalutationsWorld!’
,$lib->hello().$lib->world());
}
}
为了更好的灵活性,我个人比较倾向于组成的方法(特别是在结合了依赖性倒置的情况下);尽管如此,继承的方法提供两种版本的接口,或许在你的实际运用中反而是一个提高灵活性的关键。
注:依赖性倒置原理
依赖性倒置原理(首先在
http://www.objectmentor.com/resources/articles/dip.pdf中由RobertC.Martin提出)是一个面向对象
编程的准则,它表明:高层次的模块不应该依赖于低层次的模块,而应依赖于抽取。一个简单的与适配器(Adapter)模式相结合的依赖性倒置原理范例可以在以下地址中找到:
http://www.phplondon.org/wiki/DependencyInversion 适配器模式的重点是改变一个单独类的API。有一个与之相关的设计模式(本书中没有涵盖),称作正面(Facade)模式。正面(Facade)的目的是给由许多对象构成的整个子系统,提供更为简洁的接口——反过来就是封装一个单独类——可能是一个值得研究的模式,如果你正设法把你的代码与第三方库隔离开来的话。