PHP实现常用设计模式之策略模式

版权声明:转载请加链接 https://blog.csdn.net/qq_33722172/article/details/81813988

定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
是不是很官方,那么举个例子,就拿日常中使用的计算器来解释一下吧。
现在需要开发一个计算器实现加减功能,那么常规的解决方法,就是硬编码(Hard Coding)在一个计算器类中,类中实现加,减两个方法,每一个方法对应一个具体的算法;当然也可以把加减两种方法写到一个方法中,通过传参if…else…或者case等条件判断语句来进行选择使用哪种算法。
那么问题来了,当我需要增加一个功能比如乘法,需要怎么做呢?我们就得去修改计算器类,去增加一个实现乘法的方法,再增加一个除法呢?再增加一个取模呢?
很明显这样设计是有问题的,随着方法大的增多,类变得越来越臃肿,维护,扩展都不方便。
怎么解决这个问题?这里就要用到策略模式了
首先定义一个算法接口,接着将我们实现的算法都单独封装起来并实现这个接口,
比如加法类,减法类,最后再增加一个虚拟计算器类,用来调用各个算法类,服务端接受前端传递过来的参数并通过虚拟计算器类实例化需要的算法类进行计算,这里面当我们需要增加或减少一个算法时,只需要新增或减少一个算法类即可(当然要继承算法接口)
代码如下:

<!--前端代码-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>简单计算器</title>
</head>
<body>
    <form action="11.php" method="POST">
        <input type="text" name="op1">
        <select name="op" >
            <option value="add">+</option>
            <option value="sub">-</option>
            <option value="mul">*</option>
            <option value="div">/</option>
        </select>
        <input type="text" name="op2">
        <p><input type="submit"  value="计算"></p>
    </form>
</body>
</html>
//服务端代码
<?php
/*
策略模式
 */
interface Math{
    public function math($op1,$op2);
}
class addMath implements Math{
    public function math($op1,$op2){
        return $op1+$op2;
    }
}
class subMath implements Math{
    public function math($op1,$op2){
        return $op1-$op2;
    }
}
class mulMath implements Math{
    public function math($op1,$op2){
        return $op1*$op2;
    }
}

class divMath implements Math{
    public function math($op1,$op2){
        return $op1/$op2;
    }
}
//封装一个虚拟计算器
class varMath{
    protected $call = null;
    public function __construct($type){
        $call = $type.'Math';
        $this->call = new $call();

    }
    public function math($op1,$op2){
        return $this->call->math($op1,$op2);
    }
}
$val = $_POST['op'];
$varmath = new varMath($val);
echo $varmath->math($_POST['op1'],$_POST['op2']);

猜你喜欢

转载自blog.csdn.net/qq_33722172/article/details/81813988