PHP知识、源码、教程、框架、程序分享! -- PHP社区 关于我们 联系我们 联系电话 联系QQ

PHP编程语言中的策略模式

发表时间:2013-09-25 点击:

[本文摘要]:PHP编程 语言中的策略模式 策略模式的一个典型应用是处理程序算法与其他算法之间的互换。例如,如果你编写了创建一幅图片的代码,在一些情况下,你可能需要创建JPEG的图片,而在...

PHP编程语言中的策略模式

策略模式的一个典型应用是处理程序算法与其他算法之间的互换。例如,如果你编写了创建一幅图片的代码,在一些情况下,你可能需要创建JPEG的图片,而在另外一些情况下,你可能需要创建GIF文件。

策略模式的实现方法通常是通过声明一个抽象的拥有一个算法方法的基类来实现的,而且通过继承这个基类的具体的类来实现。在代码中的一些关键点,设计模式将决定哪个具体的策略是相关的,然后实例化并使用任何相关的类。

我们的例子显示了一个下载服务如何根据访问它的Web客户端选择不同文件的策略。在它创建一个包含链接的HTML时,它将根据浏览器的操作系统的标识创建指向.tar.gz或者zip文件的下载链接。当然,这意味着两个文件都要求可以通过服务器上统一的格式访问。简单来说,假设词语“Win”存在于$_SERVER[ "HTTP_USER_AGENT"]中,说明我们正在处理一个来自Windows系统的请求,因此需要创建.zip的链接:反之,我们就在处理需要.tar.gz格式的系统。

在这个例子中,我们将使用两种策略:.tar.gz策略和zip策略,它们可以通过下面的策略层次图映射出来(见图4.3)。

策略层次图
图4.3 策略层次图

下面的代码段将让你了解如何使用这样一个策略模式:

abstract class FileNamingStrategy {
	abstract  function  createLinkName ($filename);
	}
class ZipFileNamingStrategy extends FileNamingStrategy{
	function createLinkName($filename){
	  return "http://downloads.foo.bar/$filename.zip";
	}
}
class TarGzFileNamingStrategy  extends  FileNamingStrategy{
	function  createLinkName($filename){
	  return  "http://downloads.foo.bar/$filename.tar.gz ";
	}
}
if (strstr($_SERVER["HTTP_USER_AGENT"], "Win" )){
	  $fileNamingObj = new ZipFileNamingStrategy();
	else{
	  $fileNamingObj = new TarGzFileNamingStrategy();
}
$calc_filename  =  $ fileNamingObj ->createLinkName(" Calcl01");
$stat_filename = $fileNamingObj ->createLinkName["Stat2000");
print <<<EOF
	<h1>The followingis a list of great downloads</h1>
	<br>
	<a href="$calc_filename" >A great calculacor</a><br>
	<a href="$stat_filename">The best, statistics application</a><br>
	<br>
EOF;

在Windows系统下访问这个脚本将给你如下的HTML输出:

<h1>The following is a list of great downloads</h1>

<br>

<a href="http://downloads.foo.bar/Calcl01.zip">A great calculator</a><br>

<a  href= "http://downloads.foo.bar/Stat2000.zip" >The best statistics application</a><br>

<br>

提示:策略模式经常跟工厂模式一起使用,工厂模式将在本节的后续部分描述。工厂模式用来选择一个合适的策略。

上一篇:没有了 下一篇:PHP编程语言中的单件模式

版权声明:本文系技术人员研究整理的智慧结晶,转载勿用于商业用途,并保留本文链接,侵权必究!

本文链接:http://php.aixc.cn/phpzs/phpshili/328.html

声明:本站技术及源码均为原创,转载请勿用于商业用途,并注明出处及原文链接,侵权必究。