PHP实现的策略模式简单示例

下面我来详细讲解PHP实现的策略模式简单示例的完整攻略。

策略模式简介

策略模式是一种行为设计模式,它允许你定义一系列算法,并将每个算法都封装起来,使它们可以相互替换。在策略模式中,算法的变化独立于使用算法的客户端。这意味着你可以在不修改客户端代码的情况下,更改算法的实现。

示例说明

下面我们通过两个示例来说明策略模式的使用。

示例一:收银员结算账单

假设我们有一个商场,收银员需要对顾客购物的商品进行结算。不同的商品有不同的优惠策略,比如打折、满减等等。我们可以使用策略模式来实现这个场景。

首先我们定义一个接口DiscountStrategy,它有一个方法getDiscount($price),用来计算商品的实际优惠价格。

interface DiscountStrategy {
    public function getDiscount($price);
}

然后,我们可以创建不同的具体策略类,比如PercentageDiscountStrategy,它实现了DiscountStrategy接口,并实现了getDiscount($price)方法,用于计算百分比优惠的价格。

class PercentageDiscountStrategy implements DiscountStrategy {
    private $discountRate;

    public function __construct($discountRate) {
        $this->discountRate = $discountRate;
    }

    public function getDiscount($price) {
        return round($price * $this->discountRate, 2);
    }
}

类似地,我们还可以创建满减优惠的策略类FullReductionDiscountStrategy

class FullReductionDiscountStrategy implements DiscountStrategy {
    private $full;
    private $reduction;

    public function __construct($full, $reduction) {
        $this->full = $full;
        $this->reduction = $reduction;
    }

    public function getDiscount($price) {
        if ($price >= $this->full) {
            return $price - $this->reduction;
        } else {
            return $price;
        }
    }
}

最后,我们可以创建一个Cashier类,用于计算商品的实际价格。它有一个setDiscountStrategy($strategy)方法,用于设置优惠策略。

class Cashier {
    private $discountStrategy;

    public function setDiscountStrategy(DiscountStrategy $strategy) {
        $this->discountStrategy = $strategy;
    }

    public function checkout($price) {
        $discountPrice = $this->discountStrategy->getDiscount($price);
        $finalPrice = $price - $discountPrice;
        return $finalPrice;
    }
}

使用时,我们可以创建一个Cashier对象,然后根据商品的不同优惠策略,设置不同的策略对象。

$cashier = new Cashier();

// 打9折
$percentageStrategy = new PercentageDiscountStrategy(0.9);
$cashier->setDiscountStrategy($percentageStrategy);
echo "Price after discount: " . $cashier->checkout(100) . PHP_EOL; // 输出90

// 满100减20
$fullReductionStrategy = new FullReductionDiscountStrategy(100, 20);
$cashier->setDiscountStrategy($fullReductionStrategy);
echo "Price after discount: " . $cashier->checkout(100) . PHP_EOL; // 输出80

示例二:动态选择日志记录方式

我们假设有一个日志记录模块,我们可以使用策略模式来实现动态选择不同的日志记录方式。

首先我们定义一个接口Logger,它有一个方法log($message),用于记录日志。

interface Logger {
    public function log($message);
}

然后,我们可以创建不同的具体日志记录类,比如FileLogger,它实现了Logger接口,并实现了log($message)方法,用于将日志记录到文件里。

class FileLogger implements Logger {
    private $fileName;

    public function __construct($fileName) {
        $this->fileName = $fileName;
    }

    public function log($message) {
        file_put_contents($this->fileName, $message . PHP_EOL, FILE_APPEND);
    }
}

类似地,我们还可以创建将日志记录到数据库的DatabaseLogger

class DatabaseLogger implements Logger {
    private $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function log($message) {
        $this->pdo->exec("INSERT INTO log (message) VALUES ('$message')");
    }
}

最后,我们可以创建一个LoggerContext类,它有一个setLogger($logger)方法,用于设置具体的日志记录类。

class LoggerContext {
    private $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }

    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }

    public function log($message) {
        $this->logger->log($message);
    }
}

使用时,我们可以创建一个LoggerContext对象,并根据需要选择不同的日志记录方式。

// 将日志记录到文件
$logContext = new LoggerContext(new FileLogger('/var/log/myapp.log'));
$logContext->log('Hello, world!');

// 将日志记录到数据库
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8', 'root', 'password');
$logContext->setLogger(new DatabaseLogger($pdo));
$logContext->log('Hello, world again!');

以上就是PHP实现的策略模式简单示例的完整攻略。希望可以帮助您掌握策略模式的使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现的策略模式简单示例 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • PHP如何将图片文件上传到另外一台服务器上

    下面是详细讲解“PHP如何将图片文件上传到另外一台服务器上”的完整攻略。 一、前置条件 在介绍具体的上传方法之前,需要确认以下前置条件: 到达目标服务器的上传路径必须可访问; 目标服务器对上传的文件类型需要有限制; PHP必须被服务器正确地安装和配置。 二、使用 cURL 上传文件 cURL是一种使用 URL 语法传输数据的工具,支持FTP、HTTP、scp…

    PHP 2023年5月23日
    00
  • php unicode编码和字符串互转的方法

    下面是完整攻略。 PHP Unicode编码和字符串互转的方法 Unicode编码简介 Unicode是一种字符编码方案,它用来表现世界上所有语言包括不同的文字、符号和表情等。它的编码范围从U+0000到U+10FFFF,共有1,114,112个字符,其中有146,746个字符被分配给Unicode 8.0版本。 在PHP中,每个Unicode字符用一个或多…

    PHP 2023年5月26日
    00
  • PHP实现二维数组中的查找算法小结

    PHP实现二维数组中的查找算法小结 在PHP开发中,使用二维数组是非常常见的。如果需要在二维数组中查找特定元素,可以使用查找算法来实现。本文将详细介绍PHP实现二维数组中的查找算法。 二维数组 首先,让我们回顾一下二维数组的概念。二维数组是由多个一维数组组成的数组。每个一维数组都代表二维数组的一行数据。 例如,下面是一个包含3行4列数据的二维数组: $dat…

    PHP 2023年5月26日
    00
  • 推荐免费个人网络空间

    推荐免费个人网络空间的完整攻略如下: 1. 搜集免费网络空间资源 首先需要在互联网上搜集各种免费个人网络空间资源,如Github Pages、Netlify等。需要考虑以下因素: 空间大小:必须满足个人需求。 可用性:需要确认服务提供商提供的服务是否符合个人需求,如HTTPS支持、域名绑定等。 稳定性:选择大型的免费空间提供商,避免频繁的服务异常导致个人网站…

    PHP 2023年5月27日
    00
  • php 转换字符串编码 iconv与mb_convert_encoding的区别说明

    关于“php 转换字符串编码 iconv 与 mb_convert_encoding 的区别说明”的完整攻略,下面是详细的标准markdown格式文本: PHP 转换字符串编码的攻略 在 PHP 中,转换字符串编码是非常常见的任务之一。在这个任务中,我们可以使用两个主要的函数:iconv 和 mb_convert_encoding。 iconv 函数 ico…

    PHP 2023年5月26日
    00
  • 用PHP和MySQL保存和输出图片

    使用PHP和MySQL保存和输出图片的完整攻略包括以下步骤: 创建数据库表:首先需要创建一个用来保存图片的数据库表。表中应该包含两个列,一个是用来保存图片的二进制数据的列,另一个是用来指定图片类型的列,常用的图片类型包括JPEG、PNG和GIF。 示例代码: CREATE TABLE `images` ( `id` int(11) NOT NULL AUTO…

    PHP 2023年5月26日
    00
  • php实现简单的权限管理的示例代码

    下面我将详细讲解如何通过 PHP 实现简单的权限管理。 什么是权限管理? 权限管理是指在系统或网站中,对不同用户或用户组的访问和操作进行限制或授权的管理。 为什么需要权限管理? 在系统或网站中,存在着一些对不同用户或用户组可见但不同权限的内容,对于不同的用户或用户组,应该有不同的权限来限制或授权对这些内容的访问和操作,避免数据泄露和操作失误等问题。 如何实现…

    PHP 2023年5月24日
    00
  • php实现微信公众号企业转账功能

    下面是 “php实现微信公众号企业转账功能”的完整攻略: 1. 申请开通微信支付 在使用微信支付进行企业转账前,需要先在微信商户平台中开通微信支付功能,并获取到商户号(mchid)、api密钥(api_key)和证书文件等信息。 2. 下载微信支付SDK文件 官方提供了微信支付的SDK文件,下载后解压到本地目录。 3. 接入微信支付SDK文件 将下载的微信支…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部