发布时间:2017-04-26编辑:lianpenglin阅读(1596)
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
封装:把行为用接口封装起来,我们可以把那些经常变化的部分,从当前的类中单独取出来,用接口进行单独的封装。
互相替换:我们封装好了接口,通过指定不同的接口实现类进行算法的变化。
下面我来举个例子详细说明下:
比如我们有一个页面实现了简单计算器的功能,普通写法需要我们根据传过来的符号,通过if/else来判断具体是哪一种计算符号,代码如下:
<?php
//简单计算器普通写法实现
$op = $_POST['op'];//计算器的符号:加减乘除
$num1 = $_POST['num1'];//第一个参与计算的数字
$num2 = $_POST['num2'];//第二个参与计算的数字
if($op == 'add'){
    return $num1 + $num2;
}elseif ($op == 'sub'){
    return $num1 - $num2;
}elseif ($op == 'mul') {
    return $num1 * $num2;
} elseif ($op == 'div') {
    return $num1 / $num2;
} else {
    return "未找到计算符号";
}通过代码可以看到,这样子写出的代码,扩展性比较差,如果多一个计算符号就需要多一个elseif的判断,下面我们看一下用了策略模式之后的代码:
<?php
/*
 *PHP策略模式 ,已计算器为例
 */
//定义一个计算器接口
interface Math {
    public function calc($op1,$op2);
}
//加法类
class MathAdd implements Math {
    
    public function calc($op1, $op2){
        return $op1 + $op2;
    }
}
//减法类
class MathSub implements Math {
    /**
     * {@inheritDoc}
     * @see Math::calc()
     */
    public function calc($op1, $op2)
    {
        // TODO Auto-generated method stub
        return $op1 - $op2;
    }
}
//乘法类
class MathMul implements Math {
    /**
     * {@inheritDoc}
     * @see Math::calc()
     */
    public function calc($op1, $op2)
    {
        // TODO Auto-generated method stub
        return $op1 * $op2;
    }
}
//除法类
class MathDiv implements Math{
    /**
     * {@inheritDoc}
     * @see Math::calc()
     */
    public function calc($op1, $op2)
    {
        // TODO Auto-generated method stub
        return $op1 / $op2;
    }
}
//一个虚拟的计算器
class Cmath {
    public $cecl;
    public function __construct($op)
    {
       $cecl = 'Math'.$op;
       $this->cecl = new $cecl;
    }
    
    public function cecl($op1,$op2)
    {
        return $this->cecl->calc($op1,$op2);
    }
    
}
//初始化虚拟计算器类
$math = new Cmath('Add');
echo $math->cecl(1, 5);通过策略模式重写之后的代码,我们可以看到,所有的计算我们只需和虚拟计算器类,Cmath打交到就可以,Cmath会根据我们传入的不同参数,实例化不同的计算方法类进行计算,当有新的计算符号时,我们只需新建一个计算类,实现Math接口即可。
总的来说,我们在开发中的设计原则如下:
1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
2.针对接口编程,不针对实现编程;
3.多用组合,少用继承;
标签: php
如果对你有用打赏一下吧!
									
									
								
上一篇: php设计模式之观察者模式
下一篇: PHP设计模式之桥接者模式