《五种常见的 PHP 设计模式.pdf》由会员分享,可在线阅读,更多相关《五种常见的 PHP 设计模式.pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、五种常见的五种常见的 PHPPHP 设计模式设计模式设计模式只是为 Java 架构师准备的 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是“架构太空人”的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非常有用?本文解释了这些问题。设计模式不仅代表着更快开发健壮软件的有用方法,而且还提供了以友好的术语封装大型理念的方法。例如,您可以说您正在编写一个提供松散耦合的消息传递系统,也可以说你正在编写名称为观察者 的模式。用较小的示例展示模式的价值是非常困难的。这往往有些大材小用的意味,因为模式实际上是在大型代码库中发挥作用的。本文不展示大型应用程序,所以您需
2、要思索的是在您自己的大型应用程序中应用示例原理的方法 而不是本文演示的代码本身。这不是说您不应该在小应用程序中使用模式。很多良好的应用程序都以小应用程序为起点,逐渐发展到大型应用程序,所以没有理由不以此类扎实的编码实践为基础。既然您已经了解了设计模式以及它们的有用之处,现在我们来看看 PHP5 的五种常用模式。工厂模式最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 您曾认为完全不相关的部分中也有可能出现级联破坏。该问题在于紧密耦合。系统某个部分中的函数和类严重依赖于系统
3、的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。清单 1 显示工厂类的一个示列。等式的服务器端包括两个部分:
4、数据库和一组 PHP 页面,这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章。清单 1.Factory1.php复制PHP内容到剪贴板PHP代码:命令链模式命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。清单 5 显示了此模式的一个示例。清单 5.Chain.php复制PHP内容到剪贴板PHP代码:_commands=$cmd;public function runCommand($name,$args)fore
5、ach($this-_commands as$cmd)if($cmd-onCommand($name,$args)return;class UserCommand implements ICommandpublic function onCommand($name,$args)if($name!=addUser)return false;echo(“UserCommand handling addUsern”);return true;class MailCommand implements ICommandpublic function onCommand($name,$args)if($n
6、ame!=mail)return false;echo(“MailCommand handling mailn”);return true;$cc=new CommandChain();$cc-addCommand(new UserCommand();$cc-addCommand(new MailCommand();$cc-runCommand(addUser,null);$cc-runCommand(mail,null);?此代码定义维护ICommand 对象列表的CommandChain 类。两个类都可以实现ICommand 接口 一个对邮件的请求作出响应,另一个对添加用户作出响应。图 5
7、 给出了 UML。图 5.命令链及其相关命令如果您运行包含某些测试代码的脚本,则会得到以下输出:%php chain.phpUserCommand handling addUserMailCommand handling mail%代码首先创建 CommandChain 对象,并为它添加两个命令对象的实例。然后运行两个命令以查看谁对这些命令作出了响应。如果命令的名称匹配 UserCommand 或 MailCommand,则代码失败,不发生任何操作。为处理请求而创建可扩展的架构时,命令链模式很有价值,使用它可以解决许多问题。策略模式我们讲述的最后一个设计模式是策略模式。在此模式中,算法是从复杂
8、类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。作为一个较简单的示例,清单 6 显示了一个用户列表类,它提供了一个根据一组即插即用的策略查找一组用户的方法。清单 6.Strategy.php复制PHP内容到剪贴板PHP代码:_name=$name;public function filter($record)return
9、 strcmp($this-_name,$record)=0.5;class UserListprivate$_list=array();public function _construct($names)if($names!=null)foreach($names as$name)$this-_list=$name;public function add($name)$this-_list=$name;public function find($filter)$recs=array();foreach($this-_list as$user)if($filter-filter($user)$
10、recs=$user;return$recs;$ul=new UserList(array(“Andy”,“Jack”,“Lori”,“Megan”);$f1=$ul-find(new FindAfterStrategy(“J”);print_r($f1);$f2=$ul-find(new RandomStrategy();print_r($f2);?此代码的 UML 如图 6 所示。图 6.用户列表和用于选择用户的策略UserList 类是打包名称数组的一个包装器。它实现 find 方法,该方法利用几个策略之一来选择这些名称的子集。这些策略由 IStrategy 接口定义,该接口有两个实现:一个随机选择用户,另一个根据指定名称选择其后的所有名称。运行测试代码时,将得到以下输出:%php strategy.phpArray(0=Jack1=Lori2=Megan)Array(0=Andy1=Megan)%测试代码为两个策略运行同一用户列表,并显示结果。在第一种情况中,策略查找排列在 J 后的任何名称,所以您将得到 Jack、Lori 和 Megan。第二个策略随机选取名称,每次会产生不同的结果。在这种情况下,结果为 Andy 和 Megan。策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方式方面需要较高的灵活性。本文由西安白癜风医院(http:/