引言
 
  所属:行为型模式,常用设计模式之一
    学习资料:
  • 《大话设计模式》程杰
 
模式概述
 
  分享一篇关于策略模式讲的很好的文章,大家可以参考一下:https://www.cnblogs.com/qixuejia/p/4370270.html
 
  策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
 
举个栗子
 
    超市促销活动,分别有原价,八折,满300减50,使用策略模式……,程序如何设计。
       
 
    流程图如下:
      
          

  
程序设计代码:
 1. 抽象活动算法类
<?php
/**
* 抽象活动算法类
*/
namespace strategy; abstract class StrategyAbstract
{
/**
* 具体活动算法方法
* @return mixed
*/
public abstract function doAction($money);
}

2. 具体算法产品类

<?php
/**
* 满减算法产品类
*/
namespace strategy; class ManJianStrategy extends StrategyAbstract
{
public function doAction($money)
{
echo '满减算法:原价'. $money .'元';
}
}
<?php
/**
* 打折算法产品类
*/
namespace strategy; class DaZheStrategy extends StrategyAbstract
{
/**
* 具体算法实现
* @param $money
* @return mixed|void
*/
public function doAction($money)
{
echo '打折算法:原价'. $money .'元';
}
}

3. 策略工厂类

<?php
/**
* 策略工厂类
*/
namespace strategy; class StrategyFind
{
private $strategy_mode; /**
* 初始时,传入具体的策略对象
* @param $mode
*/
public function __construct($mode)
{
$this->strategy_mode = $mode;
} /**
* 执行打折算法
* @param $money
*/
public function get($money)
{
$this->strategy_mode->doAction($money);
}
}

入口文件

<?php

namespace strategy;

include '../autoload.php';
// 满减折算
$mode1 = new StrategyFind(new ManJianStrategy());
$mode1->get(100); echo '<br>'; // 满减活动
$mode2= new StrategyFind(new DaZheStrategy());
$mode2->get(100);
 
以下为源码地址

  

  GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master

总结

  策略模式就是使用封装一个公共抽象算法,每个算法(比如,打折算法,满减算法)实现这个接口,然后搞个策略工厂类来调用这些算法。

「PHP」策略模式的更多相关文章

  1. 「PHP」观察者模式模式

    引言   所属:行为型模式,常用设计模式之一       学习资料: <大话设计模式>程杰 模式概述   观察者模式定义了一种一对多的依赖关系,让多个观察者对象监听某一个主题对象.这个主题 ...

  2. 从零开始单排学设计模式「策略模式」黑铁 II

    阅读本文大概需要 1.7 分钟. 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了, ...

  3. 「技巧」如何将Sketch改为深色模式

    之前Sketch只能根据mac系统的外观设置变更皮肤.在更新了版本54之后,可以脱离操作系统,在自己的偏好设置中更改外观了. 准备 Sketch 54 更多工具:whose.design 第一步:打开 ...

  4. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  5. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  6. 「2014-2-6」TokuMX and MongoDB related materials collection

    简介参考 TokuMX 和 MongoDB 各自的官方站点.       ##  Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...

  7. jvm系列(十):如何优化Java GC「译」

    本文由CrowHawk翻译,是Java GC调优的经典佳作. 本文翻译自Sangmin Lee发表在Cubrid上的"Become a Java GC Expert"系列文章的第三 ...

  8. spring cloud 入门,看一个微服务框架的「五脏六腑」

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...

  9. 从 Spring Cloud 看一个微服务框架的「五脏六腑」

    原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...

随机推荐

  1. jar 解压war包到指定目录

    用 jar -xvf  .jar 命令默认解压到当前目录,想要解压到指定目录 需要使用unzip .jar -d 目录 如: unzip pay.war -d /home/zookeeper1/tes ...

  2. js 生成md5

    原理比较复杂,不过人类区别与其他动物是因为会用工具,所以,把下面代码复制保存一下就好了. <script> var hex_chr = "0123456789abcdef&quo ...

  3. 【Leetcode】【Medium】Unique Paths

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  4. Retrofit-入门使用

    1. 在模块目录下的build.gradle dependencies { compile "com.squareup.retrofit2:retrofit:2.1.0" comp ...

  5. 记一次挖掘115网盘反射型xss,08xss的储存型xss

    记一次对115分站简单绕过过滤继续实现xss,08xss平台也中枪!! 115反射型xss url:http://115.qiye.115.com/disk/?ac=select_public_fil ...

  6. mysql 查询大量数据报错

    错误:Incorrect key file for table '/tmp/#sql_... 由于一次查询出大量数据,并且使用了临时表,导致产生此错误,主要是存放临时表文件的/tmp目录大小不足导致.

  7. 使用react-redux开发的简单步骤

    一.安装相关包 npm install redux react-redux --save 二.根据具体情形创建模块文件 Store.js.Reducer.js.Actions.js Store.js的 ...

  8. redis持久化那些事(kēng)儿

    这是一篇包含了介绍性质和吐槽性质的日志.主要介绍一下我学习redis持久化时候被坑的经历.redis的使用介绍现在没有打算写,因为比较多,以我如此懒的性格...好吧,还是有点这方面想法的,不过一篇博客 ...

  9. GCD学习(五) dispatch_barrier_async

    先看段代码 dispatch_queue_t concurrentQueue = dispatch_queue_create("my.concurrent.queue", DISP ...

  10. vue - 数据驱动,组件化, 双向绑定原理

    1.数据驱动 传统的前端数据交互是用Ajax从服务端获取数据,然后操作DOM来改变视图: Vue.js 是一个提供了 MVVM 风格的双向数据绑定的 Javascript 库,专注于View 层.它让 ...