例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告
6 项目应用 <?php
/**
* strategy.php
*
* 策略类:定义了一系列的算法,这些算法都是完成的相同工作,但是实现不同。
*
* 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的
* 代码会有改变和优化。
*
* Copyright (c) 2015 http://blog.csdn.net/CleverCode
*
* modification history:
* --------------------
* 2015/5/5, by CleverCode, Create
*
*/
// 定义接口现金策略,每种策略都是具体实现acceptCash,但都是实现收取现金功能
interface ICashStrategy{
// 收取现金
public function acceptCash($money);
}
// 正常收取策略
class NormalStrategy implements ICashStrategy{
/**
* 返回正常金额
*
* @param double $money 金额
* @return double 金额
*/
public function acceptCash($money){
return $money;
}
}
// 打折策略
class RebateStrategy implements ICashStrategy{
// 打折比例
private $_moneyRebate = 1;
/**
* 构造函数
*
* @param double $rebate 比例
* @return void
*/
public function __construct($rebate){
$this->_moneyRebate = $rebate;
}
/**
* 返回正常金额
*
* @param double $money 金额
* @return double 金额
*/
public function acceptCash($money){
return $this->_moneyRebate * $money;
}
}
// 返利策略
class ReturnStrategy implements ICashStrategy{
// 返利条件
private $_moneyCondition = null;
// 返利多少
private $_moneyReturn = null;
/**
* 构造函数
*
* @param double $moneyCondition 返利条件
* @return double $moneyReturn 返利多少
* @return void
*/
public function __construct($moneyCondition, $moneyReturn){
$this->_moneyCondition = $moneyCondition;
$this->_moneyReturn = $moneyReturn;
}
/**
* 返回正常金额
*
* @param double $money 金额
* @return double 金额
*/
public function acceptCash($money){
if (!isset($this->_moneyCondition) || !isset($this->_moneyReturn) || $this->_moneyCondition == 0) {
return $money;
}
return $money - floor($money / $this->_moneyCondition) * $this->_moneyReturn;
}
}
<?php
/**
* strategyPattern.php
*
* 设计模式:策略模式
*
* 模式简介:
* 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,
* 不会影响到使用算法的客户。
* 策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是
* 相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类
* 与使用算法类的耦合。
* 本源码中的各种结账方式,其实都是在结账,但是具体的实现确实不同的。策略模式与
* 命令模式不同的是,命令模式的算法是相互独立的,每个命令做的工作是不同的。而策略模式
* 却是在做通一种工作。
*
* 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的
* 代码会有改变和优化。
*
* Copyright (c) 2015 http://blog.csdn.net/CleverCode
*
* modification history:
* --------------------
* 2015/5/14, by CleverCode, Create
*
*/
// 加载所有的策略
include_once ('strategy.php');
// 创建一个环境类,根据不同的需求调用不同策略
class CashContext{
// 策略
private $_strategy = null;
/**
* 构造函数
*
* @param string $type 类型
* @return void
*/
public function __construct($type = null){
if (!isset($type)) {
return;
}
$this->setCashStrategy($type);
}
/**
* 设置策略(简单工厂与策略模式混合使用)
*
* @param string $type 类型
* @return void
*/
public function setCashStrategy($type){
$cs = null;
switch ($type) {
// 正常策略
case 'normal' :
$cs = new NormalStrategy();
break;
// 打折策略
case 'rebate8' :
$cs = new RebateStrategy(0.8);
break;
// 返利策略
case 'return300to100' :
$cs = new ReturnStrategy(300, 100);
break;
}
$this->_strategy = $cs;
}
/**
* 获取结果
*
* @param double $money 金额
* @return double
*/
public function getResult($money){
return $this->_strategy->acceptCash($money);
}
/**
* 获取结果
*
* @param string $type 类型
* @param int $num 数量
* @param double $price 单价
* @return double
*/
public function getResultAll($type, $num, $price){
$this->setCashStrategy($type);
return $this->getResult($num * $price);
}
}
/*
* 客户端类
* 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合,
* 使业务逻辑的算法更具有可移植性
*/
class Client{
public function main(){
$total = 0;
$cashContext = new CashContext();
// 购买数量
$numA = 10;
// 单价
$priceA = 100;
// 策略模式获取结果
$totalA = $cashContext->getResultAll('normal', $numA, $priceA);
$this->display('A', 'normal', $numA, $priceA, $totalA);
// 购买数量
$numB = 5;
// 单价
$priceB = 100;
// 打折策略获取结果
$totalB = $cashContext->getResultAll('rebate8', $numB, $priceB);
$this->display('B', 'rebate8', $numB, $priceB, $totalB);
// 购买数量
$numC = 10;
// 单价
$priceC = 100;
// 返利策略获取结果
$totalC = $cashContext->getResultAll('return300to100', $numC, $priceC);
$this->display('C', 'return300to100', $numC, $priceC, $totalC);
}
/**
* 打印
*
* @param string $name 商品名
* @param string $type 类型
* @param int $num 数量
* @param double $price 单价
* @return double
*/
public function display($name, $type, $num, $price, $total){
echo date('Y-m-d H:i:s') . ",$name,[$type],num:$num,price:$price,total:$total\r\n";
}
}
/**
* 程序入口
*/
function start(){
$client = new Client();
$client->main();
}
start();
?>
<?php /** * strategy.php * * 策略类:定义了一系列的算法,这些算法都是完成的相同工作,但是实现不同。 * * 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的 * 代码会有改变和优化。 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/5/5, by CleverCode, Create * */ // 定义接口现金策略,每种策略都是具体实现acceptCash,但都是实现收取现金功能 interface ICashStrategy{ // 收取现金 public function acceptCash($money); } // 正常收取策略 class NormalStrategy implements ICashStrategy{ /** * 返回正常金额 * * @param double $money 金额 * @return double 金额 */ public function acceptCash($money){ return $money; } } // 打折策略 class RebateStrategy implements ICashStrategy{ // 打折比例 private $_moneyRebate = 1; /** * 构造函数 * * @param double $rebate 比例 * @return void */ public function __construct($rebate){ $this->_moneyRebate = $rebate; } /** * 返回正常金额 * * @param double $money 金额 * @return double 金额 */ public function acceptCash($money){ return $this->_moneyRebate * $money; } } // 返利策略 class ReturnStrategy implements ICashStrategy{ // 返利条件 private $_moneyCondition = null; // 返利多少 private $_moneyReturn = null; /** * 构造函数 * * @param double $moneyCondition 返利条件 * @return double $moneyReturn 返利多少 * @return void */ public function __construct($moneyCondition, $moneyReturn){ $this->_moneyCondition = $moneyCondition; $this->_moneyReturn = $moneyReturn; } /** * 返回正常金额 * * @param double $money 金额 * @return double 金额 */ public function acceptCash($money){ if (!isset($this->_moneyCondition) || !isset($this->_moneyReturn) || $this->_moneyCondition == 0) { return $money; } return $money - floor($money / $this->_moneyCondition) * $this->_moneyReturn; } }
<?php /** * strategyPattern.php * * 设计模式:策略模式 * * 模式简介: * 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, * 不会影响到使用算法的客户。 * 策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是 * 相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类 * 与使用算法类的耦合。 * 本源码中的各种结账方式,其实都是在结账,但是具体的实现确实不同的。策略模式与 * 命令模式不同的是,命令模式的算法是相互独立的,每个命令做的工作是不同的。而策略模式 * 却是在做通一种工作。 * * 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的 * 代码会有改变和优化。 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/5/14, by CleverCode, Create * */ // 加载所有的策略 include_once ('strategy.php'); // 创建一个环境类,根据不同的需求调用不同策略 class CashContext{ // 策略 private $_strategy = null; /** * 构造函数 * * @param string $type 类型 * @return void */ public function __construct($type = null){ if (!isset($type)) { return; } $this->setCashStrategy($type); } /** * 设置策略(简单工厂与策略模式混合使用) * * @param string $type 类型 * @return void */ public function setCashStrategy($type){ $cs = null; switch ($type) { // 正常策略 case 'normal' : $cs = new NormalStrategy(); break; // 打折策略 case 'rebate8' : $cs = new RebateStrategy(0.8); break; // 返利策略 case 'return300to100' : $cs = new ReturnStrategy(300, 100); break; } $this->_strategy = $cs; } /** * 获取结果 * * @param double $money 金额 * @return double */ public function getResult($money){ return $this->_strategy->acceptCash($money); } /** * 获取结果 * * @param string $type 类型 * @param int $num 数量 * @param double $price 单价 * @return double */ public function getResultAll($type, $num, $price){ $this->setCashStrategy($type); return $this->getResult($num * $price); } } /* * 客户端类 * 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合, * 使业务逻辑的算法更具有可移植性 */ class Client{ public function main(){ $total = 0; $cashContext = new CashContext(); // 购买数量 $numA = 10; // 单价 $priceA = 100; // 策略模式获取结果 $totalA = $cashContext->getResultAll('normal', $numA, $priceA); $this->display('A', 'normal', $numA, $priceA, $totalA); // 购买数量 $numB = 5; // 单价 $priceB = 100; // 打折策略获取结果 $totalB = $cashContext->getResultAll('rebate8', $numB, $priceB); $this->display('B', 'rebate8', $numB, $priceB, $totalB); // 购买数量 $numC = 10; // 单价 $priceC = 100; // 返利策略获取结果 $totalC = $cashContext->getResultAll('return300to100', $numC, $priceC); $this->display('C', 'return300to100', $numC, $priceC, $totalC); } /** * 打印 * * @param string $name 商品名 * @param string $type 类型 * @param int $num 数量 * @param double $price 单价 * @return double */ public function display($name, $type, $num, $price, $total){ echo date('Y-m-d H:i:s') . ",$name,[$type],num:$num,price:$price,total:$total\r\n"; } } /** * 程序入口 */ function start(){ $client = new Client(); $client->main(); } start(); ?>
相关推荐:
实例分析PHP策略模式
PHP策略模式定义与用法实例详解
以上就是PHP策略模式的详细内容,更多请关注Gxl网其它相关文章!
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did81579