经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
[PHP]使用策略模式消除if else
来源:cnblogs  作者:陶士涵  时间:2021/4/6 10:17:21  对本文有异议

策略模式(Strategy Pattern)定义了一组策略,分别在不同类中封装起来,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。

大家都写过这样的代码

  1. if (conditionA) {
  2. 逻辑1
  3. } else if (conditionB) {
  4. 逻辑2
  5. } else if (conditionC) {
  6. 逻辑3
  7. } else {
  8. 逻辑4
  9. }

这种代码虽然写起来简单,但是很明显违反了面向对象的 2 个基本原则:

单一职责原则(一个类应该只有一个发生变化的原因):因为之后修改任何一个逻辑,当前类都会被修改

开闭原则(对扩展开放,对修改关闭):如果此时需要添加(删除)某个逻辑,那么不可避免的要修改原来的代码

因为违反了以上两个原则,尤其是当 if-else 块中的代码量比较大时,后续代码的扩展和维护就会逐渐变得非常困难且容易出错

if-else 不超过 2 层,块中代码 1~5 行,直接写到块中,否则封装为方法

if-else 超过 2 层,且块中代码超过 3 行,尽量使用策略模式

下面是PHP策略模式的demo,需求是当需要发送各种通知的时候 , 比如发送短信 ,发送邮件 , 发送微信通知 等等 ,可以拆分成一个个策略

  1. <?php
  2. //短信类
  3. class Sms{
  4. public function send(){
  5. echo "send sms";
  6. }
  7. }
  8. //邮件类
  9. class Email{
  10. public function send(){
  11. echo "send email";
  12. }
  13. }
  14. //微信类
  15. class Weixin{
  16. public function send(){
  17. echo "send weixin";
  18. }
  19. }
  20. //存储上面策略的工厂
  21. class Factory{
  22. public $products=array();
  23. public function get($type){
  24. return $this->products[$type];
  25. }
  26. public function register($type){
  27. $class=ucfirst($type);
  28. $this->products[$type]=new $class;
  29. }
  30. }
  31. //控制器代码
  32. class Controller{
  33. public $types=array("sms","email","weixin");
  34. public $factory=null;
  35. public function __construct(){
  36. //先生成出所有策略的对象
  37. $this->factory=new Factory();
  38. foreach($this->types as $t){
  39. $this->factory->register($t);
  40. }
  41. }
  42. public function doAction(){
  43. //根据传递的type参数 , 选择使用哪一个策略
  44. $type="sms";
  45. $notice=$this->factory->get($type);
  46. $notice->send();
  47. $type="email";
  48. $notice=$this->factory->get($type);
  49. $notice->send();
  50. }
  51. }
  52. $c=new Controller();
  53. $c->doAction();

 

原文链接:http://www.cnblogs.com/taoshihan/p/14593819.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号