->Strategy Pattern 策略模式
策略模式(Strategy Pattern)是一个很经典的设计模式,尤其在开发工程师需要用算法的参数来动态地更改算法的时候非常有用。例如,你有一个代码是用来生成图片的。那么可能在一定的场合你需要生成JPEG图片,在另外的一些场合你需要生成GIF图片。策略模式经常以这种方式出现:首先声明一个基类(abstract base class),基类包含一个算法方式。随后,声明一个实际的类来继承该基类。在代码的特定的地方,通过一个变量来决定要生成什么样的实例。
这里我们举了一个例子,来体现一个下载服务器如何通过检测用户的浏览器信息类型来使用一个不同的文件类型选择策略。通过检测浏览器的操作系统类型来决定使用“.tar.gz”还是“.zip”文件类型来生成下载页面。当然,这要求服务器上面同时存在了两种类型的文件。在这个例子中,我们简单的判断“Win”是否存在于$_SERVER["HTTP_USER_AGENT"]当中,通过判断我们将给使用Windows的用户提供“.zip”文件类型的下载,而给使用其它系统的用户提供“.tar.gz”的文件类型的下载。
在这个例子中,我们将使用两种策略,一种是“.tar.gz”的策略,另一种是“.zip”的策略,并且通过继承来实现。
关于这个例子的代码片段如下。希望大家据此例子的[b]实用性和扩展性等[/b]发表讨论。 [php]
<?php
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("Calc101");
$stat_filename = $fileNamingObj->createLinkName("Stat2000");
print <<<EOF
<h1>The following is a list of great downloads</h1>
<br>
<a href="$calc_filename">A great calculator</a><br>
<a href="$stat_filename">The best statistics application</a><br>
<br>
EOF;
?>
[/php] 看不懂啊看不懂
[[i] 本帖最后由 skyblue1984 于 2006-3-6 18:10 编辑 [/i]] 根据不同策略写不同的类
但每个类中方法的作用相同
是这样吗? 我个稍微看得懂点,把公共的特征抽象为基类的属性和方法,各自的特征在继承类中定义,根据实际情况产生继承类的实例, 看不懂
发贴就该鼓励
楼主辛苦了,继续努力!-------------------------------------------------------------------------
我的个性签名:
都说男人有钱就变坏,tmd我都当了二十多年的好人了!
我的个性书签:
银饰品[url=http://www.buysilverjewelry.net]silver jewelry[/url]/[url=http://www.ffwowgold.com]wow gold[/url]/[url=http://www.ffwowgold.com]world of warcraft gold[/url]/[url=http://www.buysilverjewelry.net]Silver Rings[/url]
页:
[1]
