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
您可能感兴趣
- 零基础学php好吗(零基础php编程好学吗)
- php如何创建二维数组(PHP二维索引数组的遍历实例分析2种方式)
- dedecms新字段(DEDECMSv5.6 tags.php标签不能按照时间排序的问题)
- php7.4 废弃功能(浅析PHP7 的垃圾回收机制)
- php如何复制数组(php5对象复制、clone、浅复制与深复制实例详解)
- php网页生成程序(php生成静态页面并实现预览功能)
- php面向对象怎么用(PHP面向对象程序设计之对象克隆clone和魔术方法__clone用法分析)
- php脚本控制方法(php swoole多进程/多线程用法示例基于php7nts版)
- php 上传图片如何压缩(PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例)
- phpstudy搭建网站全过程(phpstudy在本地搭建多个网站的方法)
- php怎么设计状态模式(php设计模式之观察者模式定义与用法经典示例)
- php开发模式有哪些(PHP设计模式之简单工厂和工厂模式实例分析)
- php封装api(PHP常用的类封装小结4个工具类)
- thinkphp5.1手动连接mysql数据库(thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例)
- php中isset函数有什么功能(PHP中的empty、isset、isnull的区别与使用实例)
- php协议使用教程学习(php中的钩子理解及应用实例分析)
- 越南新娘(越南新娘婚介网站)
- 越南新娘(越南新娘骗婚套路流程)
- 菲律宾游学(菲律宾游学中介机构)
- 菲律宾美食(菲律宾美食排行榜前十名)
- 菲律宾特产(菲律宾特产最值得买回国)
- 越南特产(越南特产首饰)
热门推荐
- MVC扩展HtmlHelper实现CheckBoxList
- laravel队列不超时(在laravel中实现事务回滚的方法)
- mysql统计函数详解(浅析MySQL的基数统计)
- js防抖用法(JavaScript的防抖和节流案例)
- Ext.MessageBox.show()的用法及参数配置
- python参模块使用教程(Python参数解析模块sys、getopt、argparse使用与对比分析)
- docker如何进入容器中(修改已有docker容器中的内容方法)
- dedecms文章内容页调用自定义字段(DEDECMS教程:上/下一篇文章标题长度的截取方法)
- javascript五大继承方式(原生Javascript实现继承方式及其优缺点详解)
- dedecms怎样找回登录密码(织梦dedecms 去掉后台登陆验证码的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9