首页 技术PHP正文

设计模式之策略模式

薄洪涛 PHP 2021-06-09 70 0 策略模式

在开始之前,我们先看一下一个令人不爽的写法

if ($k == 0) {
  // do something
} else if ($k == 1) {
  // do somethings
} else if ($k == 2) {
  // do somethings
}...

重 复的if else,多low哦

针对于if else 无作为的使用以及滥用的吐槽,if …else if … else…这确实是我们在各种项目研发中的一个利器,但是一旦他过于多,就会使逻辑混乱,让代码的可读性大大下降

策略模式的介绍

引入百科的解释:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

策略模式:顾名思义就是当要在不同的情况下做出该情况下所适用的策略,按照面向对象的是思想就是,就使用继承和多态机制,实现同一行为在不同场景下具备不同实现。

策略模式的本质:分离算法,选择实现。

主要解决

从上述的策略模式的本质中的选择实现是不是可以联想到if…else if… else…没错,在有多种算法相似的情况下,使用 if…else 或 switch…case 所带来的复杂性和臃肿性。

直接上代码

<?php
// 飞行
interface FlyBehavior {
    public function fly();
}

// 用翅膀飞
class FlyWithWings implements FlyBehavior {
    public function fly()
    {
        echo "i fly with wings";
    }
}

// 用发动机推进
class FlyWithEngine implements FlyBehavior {
    public function fly()
    {
        echo "i fly with engine";
    }
}

// 鸡类
class Chicken {
    private $flyBehavior;

    public function setFlyBehavior(FlyBehavior $flyBehavior) {
        $this->flyBehavior = $flyBehavior;
    }

    public function tryFly() {
        $this->flyBehavior->fly();
    }
}



$flyWithWings = new FlyWithWings();
$flyWithEngine = new FlyWithEngine();

$smallChicken = new Chicken();
// 菜鸡
$smallChicken->setFlyBehavior($flyWithWings);
$smallChicken->tryFly();

// 喷气鸡
$smallChicken->setFlyBehavior($flyWithEngine);
$smallChicken->tryFly();

简单说,就是使用依赖注入,挂载不同的对象,由客户端判断什么时候该用什么对象来采用不同的逻辑

消除了那些if…else的冗余代码,取而代之是直接由客户端决定使用哪种算法,然后交由上下文获取结果。增强的了扩展性,隐藏了内部实现的细节

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论