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的session反序列化漏洞问题

    对于PHP的session反序列化漏洞问题,我们可以采取以下步骤进行深入浅析和解决: 1. 了解session反序列化漏洞的本质和原理: Session是指在服务器端存储用户信息的机制,其通过cookie或GET/POST参数来识别用户。而在PHP中,我们可以通过session_start()函数启动一个Session,用$_SESSION数组来存储和管理S…

    PHP 2023年5月24日
    00
  • 重装系统软件哪个好?八款非常好用的一键重装系统软件推荐

    重装系统软件哪个好?八款非常好用的一键重装系统软件推荐 重装系统是许多电脑用户的选择,但重装系统过程往往繁琐复杂,需要耗费很长时间。为了更快速、高效地解决这一问题,我们可以使用一些一键重装系统软件。本文将为大家介绍8款非常好用的一键重装系统软件。 1. 易重装 易重装是一款非常好用的一键重装系统软件。通过易重装,我们可以轻松地实现系统恢复、重装、备份恢复、U…

    PHP 2023年5月27日
    00
  • 微信怎么打开麦克风权限?微信打开麦克风权限教程

    当你在微信中使用语音消息、视频通话、语音电话等功能时,需要打开麦克风权限。如果你的微信麦克风权限没有打开,将无法正常使用这些功能。下面是微信打开麦克风权限的教程: 打开麦克风权限 1. iOS系统 打开手机设置 -> 隐私 -> 麦克风; 找到微信,将其麦克风权限打开。 例如,iOS14系统中,具体操作步骤如下: 打开手机 设置; 选择 隐私; …

    PHP 2023年5月30日
    00
  • 54个提高PHP程序运行效率的方法

    下面我将详细讲解“54个提高PHP程序运行效率的方法”的完整攻略。 1.使用缓存 使用缓存可以大大提高PHP程序的运行效率。常见的缓存方式包括APC,Memcached,Redis等。下面以APC为例进行说明。 通过以下命令安装APC扩展: pecl install apc 然后在php.ini文件中添加下面的配置: apc.shm_segments=1 a…

    PHP 2023年5月23日
    00
  • PHP学习笔记之一

    下面是“PHP学习笔记之一”的完整攻略。 PHP学习笔记之一攻略 学习前准备 环境搭建 LAMP(Linux + Apache + MySQL + PHP)或者 WAMP(Windows + Apache + MySQL + PHP)环境搭建 建议使用最新的 PHP 版本(目前为 PHP 8),这会带来更好的性能和安全性。 学习资料 PHP 官方文档:htt…

    PHP 2023年5月24日
    00
  • php实现最简单的MVC框架实例教程

    下面我将详细讲解如何实现最简单的MVC框架。 1. MVC设计模式简介 MVC即Model-View-Controller,是一种软件设计模式。它将一个应用程序分为三个核心部分:模型、视图和控制器。这种设计模式的目的是将应用程序的内部逻辑和UI分离,使得每个部分都可以独立地进行修改和开发。 1.1 模型(Model) 模型用于封装和处理应用程序所需的数据,以…

    PHP 2023年5月23日
    00
  • PHP实现远程下载文件到本地

    下面是PHP实现远程下载文件到本地的完整攻略: 一、准备工作 在开始编写代码之前,我们需要安装PHP和相关扩展。本示例中我们需要用到的是curl扩展,可以使用以下命令进行安装: sudo apt-get install php-curl 二、实现远程下载文件到本地 实现远程下载文件到本地可以分为以下几个步骤: 1. 初始化curl 使用curl库实现远程下载…

    PHP 2023年5月23日
    00
  • PHP操作数组相关函数

    下面是PHP操作数组相关函数的完整攻略。 什么是数组 PHP数组是一种特殊类型的变量,可以存储多个值,每个值都有一个对应的索引,这个索引可以是数字或字符串。数组通常用于存储数据集合,如一组用户信息,一组选项等等。 数组的创建与初始化 在PHP中,可以使用array、[]或array()函数创建数组。如下所示: //使用array函数创建数组: $arr1 =…

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