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