php教程 php设计模式介绍之适配器模式.docVIP

php教程 php设计模式介绍之适配器模式.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
php教程 php设计模式介绍之适配器模式

php教程 php设计模式介绍之适配器模式 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。我孩子的无数玩具中有一个简要地描述了这个两难局面:你无法合理安排一个不得其所的人。 问题 你如何避免因外部库的API改变而带来的不便?假如你写了一个库,你能否提供一种方法允许你软件的现有用户进行完美地升级,即使你已经改变了你的API?为了更好地适宜于你的需要,你应该如何改变一个对象的接口? 解决方案 适配器(Adapter)模式为对象提供了一种完全不同的接口。你可以运用适配器(Adapter)来实现一个不同的类的常见接口,同时避免了因升级和拆解客户代码所引起的纠纷。 考虑一下当(不是假设!)一个第三方库的API改变将会发生什么。过去你只能是咬紧牙关修改所有的客户代码,而情况往往还不那么简单。你可能正从事一项新的项目,它要用到新版本的库所带来的特性,但你已经拥有许多旧的应用程序,并且它们与以前旧版本的库交互运行地很好。你将无法证明这些新特性的利用价值,如果这次升级意味着将要涉及到其它应用程序的客户代码。 注:控制体模式 适配器(Adapter)模式是控制体模式的最新范例。一个适配器(Adapter)的结构类似于代理服务器(Proxy)和修饰器(Decorator),而它们的不同之处在于,适配器(Adapter)的目的是改变封装类的接口,代理服务器(Proxy)和修饰器(Decorator)则是保持接口不变。 样本代码 让我们看看当API改变时,如何保护应用程序不受影响。 假设你费尽心思寻找合适的库,最后终于找到了HwLib,一个(假设的)被设计用来发送信息的代码集。 下面是HwLib类的源代码: // PHP4 /** * the HwLib helps programmers everywhere write their first program * @package HelloWorld * @version 1 */ class HwLib { /** * Say “Hello” * @deprec this function is going away in the future * @return string */ function hello() { return ‘Hello ‘; } /** * target audience * @return string */ function world() { return ‘World!’; } } 下面是库运行的范例: $hw = new HwLib; echo $hw-hello(), $hw-world(); HwLib有完备的说明文档。在文档中作者已经明确指出hello()方法会在未来的版本中不被支持(甚至淘汰)。 接下来,现在假设第二版的HwLib已经发布。一个全新的greet()方法代替了hello()。 下面是这个库的新版本(注释已被抽取掉): // version 2 class HwLib { function greet() { return ‘Greetings and Salutations ‘; } function world() { return ‘World!’; } } 为了适应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)。 第一步

您可能关注的文档

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档