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

yizhihongxing

下面我来详细讲解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日

相关文章

  • Max是什么意思?手机的max的含义是什么?

    Max是一个英文单词,意为“最大的”。在电子产品中,Max常常被用来表示某一系列产品中的最高配置。在手机产品中,“Max”通常用于表明手机的屏幕尺寸、电池容量等参数达到了该系列产品中的最大值。 比如苹果公司的iPhone系列中,通常会有一个最大的型号,如iPhone XS Max、iPhone 12 Pro Max等。这些型号通常拥有最大的屏幕尺寸、电池等硬…

    PHP 2023年5月26日
    00
  • php实现往pdf中加数字签名操作示例【附源码下载】

    我来为您详细讲解“php实现往pdf中加数字签名操作示例【附源码下载】”的完整攻略。这个操作需要用到php的一些相关库和工具,具体步骤如下: 环境准备 安装php环境,在命令行中输入php -v,查看是否已经安装成功。 安装OpenSSL扩展库,用于数字签名相关操作,可以在命令行中输入php -m | grep OpenSSL 检查是否已经安装成功。 下载相…

    PHP 2023年5月26日
    00
  • php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法

    PHP Curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法 1. Curl是什么 Curl是一个非常强大的用来通讯的工具。它支持很多网络协议,如HTTP、HTTPS、FTP、Telnet,还支持各种代理。使用Curl可以让我们实现模拟用户在浏览器上访问网站,方便进行数据的爬取、抓取 。 2. Curl的基本使用 以下代码是基于PHP Curl执行…

    PHP 2023年5月27日
    00
  • 简单解析PHP程序的运行流程

    下面我将详细讲解“简单解析PHP程序的运行流程”的完整攻略。 PHP程序的运行流程 PHP程序的运行流程可以简单概括为以下四个步骤: Web服务器接收客户端的HTTP请求。 PHP解释器读取请求中的PHP脚本,并将其翻译为可执行的指令。 PHP解释器执行脚本,并将结果返回给Web服务器。 Web服务器将PHP程序的结果发送给客户端,完成响应过程。 下面我们来…

    PHP 2023年5月23日
    00
  • PHP 数字左侧自动补0

    下面是关于“PHP 数字左侧自动补0”的完整攻略: 1. 使用 str_pad 函数进行补零操作 PHP中可以使用 str_pad 函数在左侧添加指定数量的字符进行补零操作。 语法: str_pad($str, $length, $padString, $padType); 参数说明: $str:需要补零的数字字符串; $length:指定最终的字符串长度,…

    PHP 2023年5月26日
    00
  • php中删除数组的第一个元素和最后一个元素的函数

    在 PHP 中,删除数组的第一个元素和最后一个元素,可以使用以下两个函数: array_shift() 函数:用于删除数组的第一个元素,并返回被删除元素的值。 array_pop() 函数:用于删除数组的最后一个元素,并返回被删除元素的值。 下面通过两个示例进行说明: 示例一:使用 array_shift() 函数删除数组的第一个元素 <?php $a…

    PHP 2023年5月26日
    00
  • php使用curl和正则表达式抓取网页数据示例

    下面是“php使用curl和正则表达式抓取网页数据示例”的完整攻略: 一、curl的基本用法 curl是一个非常常用的工具,它可以通过网络协议,向网络服务器发送请求,从而获取服务器返回的数据。在PHP中,可以使用curl库来发起网络请求,并获取服务器返回的数据。 1.1 基本的curl请求 下面是一个基本的curl请求的代码示例: $url = ‘https…

    PHP 2023年5月27日
    00
  • PHP实现MVC开发得最简单的方法——模型

    下面是详细讲解“PHP实现MVC开发得最简单的方法——模型”的完整攻略。 一、MVC架构简介 首先,我们需要了解一下MVC架构,它是一种常用的软件设计模式,被广泛应用于Web开发中。其目的是将应用程序的逻辑代码、表示层代码和模型层代码分离,使得数据可以独立于实现的方式进行操作。 MVC在Web应用开发中使用最广泛,它的三层分别为: 模型层(Model):负责…

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