前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[PHP]使用策略模式消除if else

[PHP]使用策略模式消除if else

作者头像
唯一Chat
发布2021-04-01 09:56:23
8170
发布2021-04-01 09:56:23
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

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

大家都写过这样的代码

代码语言:javascript
复制
if (conditionA) {
    逻辑1
} else if (conditionB) {
    逻辑2
} else if (conditionC) {
    逻辑3
} else {
    逻辑4
}

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

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

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

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

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

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

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

代码语言:javascript
复制
<?php
//短信类
class Sms{
  public function send(){
    echo "send sms";
  }
}
//邮件类
class Email{
  public function send(){
    echo "send email";
  }
}
//微信类
class Weixin{
  public function send(){
    echo "send weixin";
  }
}
//存储上面策略的工厂
class Factory{
  public $products=array();
  public function get($type){
      return $this->products[$type];
  }
  public function register($type){
      $class=ucfirst($type);
      $this->products[$type]=new $class;
  }
}
//控制器代码
class Controller{
  public $types=array("sms","email","weixin");
  public $factory=null;
  public function __construct(){
    //先生成出所有策略的对象
    $this->factory=new Factory();
    foreach($this->types as $t){
        $this->factory->register($t);
    }
  }

  public function doAction(){
   //根据传递的type参数 , 选择使用哪一个策略
    $type="sms";
    $notice=$this->factory->get($type);
    $notice->send();

    $type="email";
    $notice=$this->factory->get($type);
    $notice->send();
  }
}
$c=new Controller();
$c->doAction();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档