策略设计模式及场景

一、概述

软件设计模式中的策略模式,让我联想到生活中一个很常见的场景,挺有趣,于是记录之。

二、场景描述

三大主流操作系统mac os、windows、linux,不同平台文件的后缀名可能有所差异。例如windows上的压缩文件后缀为.zip,linux上压缩文件后缀为.tar.gz。
如果你曾经通过浏览器在网站上下载过软件,一定有过这样的体验。网站会自动选择适配你系统的软件格式,供你点击下载。那么如此便捷操作的背后是怎样做的呢?网站又如何知道你用的是什么操作系统呢?

三、策略模式

1.概念

策略模式的实现方法通常是通过声明一个抽象的拥有一个算法方法的基类来实现的,而且通过继承这个基类的具体新的的类来实现。(有点绕,话不多说,Show you a code.)

2.代码示例

abstract class FileNamingStrategy {
    abstract function createLinkName($fileName);
}

class ZipFileNamingStrategy extends FileNamingStrategy {
    function createLinkName($fileName) {
        return "https://example.com/$fileName.zip";
    }
}

class TarGzFileNamingStrategy extends FileNamingStrategy {
    function createLinkName($fileName) {
        return "http://example.com/$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>
EOF;

3.解析

  • 用户在浏览器访问页面时,HTTP请求头中带有user agent信息,UA里面包含了用户的操作系统、浏览器、浏览器版本等信息,据此服务端能够判断出用户的操作系统类型。根据不同的操作系统类型,选择new不同的对象。
  • 基类FileNamingStrategy是一个抽象类,定义了一个createLinkName的抽象方法。分别在子类ZipFileNamingStrategy、TarGzFileNamingStrategy中实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注