php怎么设计策略模式(php设计模式之策略模式应用案例详解)
类别:编程学习 浏览量:1918
时间:2022-04-02 10:11:20 php怎么设计策略模式
php设计模式之策略模式应用案例详解本文实例讲述了php设计模式之策略模式应用。分享给大家供大家参考,具体如下:
策略模式
定义:
策略模式定义一系列的算法,将每个算法封装起来,并让它们可以相互装换。策略模式让算法独立于使用它的客户而独立变化。
角色分析:
- 抽象策略角色:策略类,通常由一个接口或者抽象类实现;
- 具体策略角色:包装了相关的算法和行为;
- 环境角色:持有一个策略类的引用,最终给客户端用。
应用场景:
- 多个类只区别在表现行为不同,可以使用策略模式,在运行的时动态选择具体要执行的行为。
- 需要在不同情况下使用不同的策略(算法) ,或者策略还可能在未来用其他方式来实现。
- 对客户隐藏具策略(算法)的实现细节,彼此完全独立。
代码实现:
|
<?php /** * Created by PhpStorm. * Author: zhaorui * Date: 2019/2/27 * Time: 10:55 */ header( 'Content-Type:text/html;charset=utf-8' ); // 抽象策略接口 abstract class Strategy{ abstract function wayToSchool(); } //具体策略角色 class BikeStrategy extends Strategy{ function wayToSchool() { echo "骑自行车去上学" .PHP_EOL; } } class BusStrategy extends Strategy{ function wayToSchool() { echo "乘公共汽车去上学" .PHP_EOL; } } class TaxiStrategy extends Strategy{ function wayToSchool() { echo "坐出租去上学" .PHP_EOL; } } // 环境角色 class Context{ private $strategy ; function getStrategy( $strategyName ){ try { $strategyReflection = new ReflectionClass( $strategyName ); $this ->strategy = $strategyReflection ->newInstance(); } catch (ReflectionException $e ){ $this ->strategy = "" ; } } function goToSchool(){ $this ->strategy->wayToSchool(); } } // 测试 $context = new Context(); $context ->getStrategy( 'BusStrategy' ); $context ->goToSchool(); |
运行结果
乘公共汽车去上学
优点:
- 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
- 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
- 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换而言之,策略模式只适用于客户端知道的所有的算法或行为的情况。
- 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成共享的,这样策略类实例可以被不同客户端使用。换而言之,可以使用享元模式来减少对象的数量。
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/zhaoxiaoruiR/article/details/87969756
您可能感兴趣
- phpstudy创建网站教程交流(phpStudy V8中创建与管理站点图文教程)
- nginx如何配置php项目(Nginx服务器究竟是怎么执行PHP项目)
- thinkphp远程代码执行教程(ThinkPHP 5.x远程命令执行漏洞复现)
- dedecms兼容模式(DedeCMS 验证码不正确的解决方法php配置问题)
- php在没有命名空间之前是怎么调(php命名空间设计思想、用法与缺点分析)
- php 与asp对比(asp.net和php的区别点总结)
- php开启curl(解决PHP使用CURL发送GET请求时传递参数的问题)
- phpzip压缩原理(PHP生成zip压缩包的常用方法示例)
- php mq使用方法(PHP使用ActiveMQ实现消息队列的方法详解)
- thinkphp5框架怎么打开(thinkphp5.1框架模板布局与模板继承用法分析)
- phpstudy服务器怎么设置(phpstudy2018 访问目录服务权限问题)
- phpstudy中php用什么版本(phpstudy是什么?phpstudy有什么用?)
- php 常见的设计模式(PHP中常用的三种设计模式详解单例模式、工厂模式、观察者模式)
- php代码生成器(PHP迭代器和生成器用法实例分析)
- php微信公众号管理后台(php实现微信公众号创建自定义菜单功能的实例代码)
- 织梦cms漏洞怎么解决(织梦cms、帝国cms、PHPcms优缺点解析)
- 冬天来了手脚冰凉 真不是因为上辈子你是折翼的天使(冬天来了手脚冰凉)
- 0 1 岁婴儿最强作息指南,照着做养出天使宝宝(01岁婴儿最强作息指南)
- 沪上这16所高校 萌新 礼包开箱 哪一款让你心动(沪上这16所高校萌新)
- 她救了被绑架的他,而这一切竟是一场阴谋...(她救了被绑架的他)
- 冬季养殖这6种阴生植物,方便又好养,你家有么(冬季养殖这6种阴生植物)
- 阴生植物为什么不怕照不到阳光(阴生植物为什么不怕照不到阳光)
热门推荐
- mysql百万数据分页查询优化方案(MySQL单表亿级数据分页怎么优化?)
- angular引入组件库(详解Angular组件之中间人模式)
- sqlserver实现登录注册(Sqlserver创建用户并授权的实现步骤)
- 容器之间的通信docker(Docker容器互访的三种方法)
- dedecms模板特点(为DedeCMS换上精美多样的提示信息窗口)
- python字典的key(Python使用dict.fromkeys快速生成一个字典示例)
- 宝塔面板怎么修改安全的端口(宝塔面板如何设置伪静态规则?)
- dedecms怎么调用标签(dedecms日期调用详细说明)
- 查看SQL SERVER中指定数据库所有表的字段信息
- dedecms怎么调用标签(dedecms 织梦系统栏目及子栏目调用友情连接的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9